解题思路:
1.首先我们要找出根节点root,很显然它一定在后续遍历的最后一位,通过用size()来计算后续字符串的长度,然后结合数组输出后序遍历的根节点root;
2.再使用find()函数结合后续遍历的长度找到根节点在中序遍历中的位置,根据根节点的位置,我们可以在中序遍历中分离出左子树和右子树。
3.前序遍历的顺序是:根,左,右;我们只需重复递归操作,先对左子树进行递归,每次都输出该子树的根节点,直到子树长度为0,退出递归。然后右子树重复以上操作。
4.解题的关键:
一、找出根节点在中序遍历中的位置;
二、退出条件(子树长度为0);
三、按照 根、左、右的顺序输出;
四、每次输出只输出该数的根节点。
------------------------------------------------------------------------
上面我已经分析的比较透彻了,具体操作我就不做注释了。
P1030[NOIP2001 普及组] 求先序排列
#include<iostream>
using namespace std;
void dfs(string inor, string after) {
if (inor.size()==0)
return;
int len = after.size()-1;
//string root = after.substr(len);//这两操作效果一样的;(任选其一)
char root = after[len];//这两操作效果一样的
int k = inor.find(root);
cout << root;
dfs(inor.substr(0, k), after.substr(0,k));
dfs(inor.substr(k+1), after.substr(k,after.size()-1-k));
}
int main() {
string s1, s2;
cin >> s1 >> s2;
dfs(s1, s2);
return 0;
}