简约递归AC POJ-2255

版权声明:欢迎转载,请注出处 https://blog.csdn.net/qq_33850304/article/details/82915097

题目描述

POJ-2255是一个简单的二叉树遍历问题,给出前序遍历和中序遍历结果,求出后序遍历。大体浏览了各位大佬们的代码,发现用递归完成是比较简单的选择,但是大佬的代码萌新实在看不懂,只好自己来写一个了

解决方案

                                           D

                                          / \

                                         /   \

                                        B     E

                                       / \     \

                                      /   \     \

                                     A     C     G

                                                /

                                               /

                                              F

这位二叉树的前序遍历为DBACEGF,中序遍历为ABCDEFG。仔细观察揣摩便可发现前序遍历的第一个字符(D)肯定是这个子树的根,而这个根放到中序遍历中便可将之分为左子树和右子树,这里ABC(左子树)D(根)EFG(右子树),这样就可以递归解决了,因为所有的问题都可以交给下一层递归来解决,我们只需约定递归终止条件即可。
而这里的终止条件就是前序遍历和中序遍历都只有相同的一个字符或均为空。

代码实现

#include <iostream>
#include <string>        
using namespace std;

void arrange(string pre, string in){
    int pos;
    if (pre.length()>0){                                //pre 和 in长度随时都相等,若为0,则递归到此结束,若为1则会直接输出
        pos = in.find(pre[0]);                          //pre[0]是根节点,去中序遍历里面明确其位置
        arrange(pre.substr(1,pos),in.substr(0,pos));    //处理左子树的前序遍历和中序遍历
        arrange(pre.substr(pos+1),in.substr(pos+1));    //处理右子树的前序遍历和中序遍历
        cout<<pre[0];                                   //输出根节点
    }
}
int main()
{
	string pre,in;  //string的输入比较迷,记录一下
    while(cin>>pre>>in){
        arrange(pre, in);   //处理前序和中序遍历
        cout<<endl;
    }
    return 0;
}

细节

  • 输出时要加上回车
  • #include<string> + using namespace std; 注意不是#include<cstring>
  • 自己用笔画一画可以方便理解

猜你喜欢

转载自blog.csdn.net/qq_33850304/article/details/82915097