注:知二求一必须有中序遍历序列
题目描述:
输入一棵二叉树的先序遍历和中序遍历序列,输出它的后序遍历序列。
解题思路:
1、考察根据两个遍历序列的二叉树的重建,三步走即可:前序找根、中序分左右、递归还原;
2、根据题意,对树只有输出结点操作,完全没有必要生成结点重新构建树,只需要在递归的过程中按照后序遍历的顺序左右根,把输出根放在递归左右子树之后即可。
代码实现:
#include <iostream>
using namespace std;
void Output(string s_pre, string s_in, int len)
{
if (len == 0)
{
return;
}
char temp = s_pre[0];
int loc = s_in.find(temp);
Output(s_pre.substr(1, loc), s_in.substr(0, loc), loc);
Output(s_pre.substr(loc + 1, len - loc - 1), s_in.substr(loc + 1, len - loc - 1), len - loc - 1);
cout << temp;
}
int main()
{
string s_pre, s_in;
while (cin >> s_pre >> s_in)
{
int len = s_pre.size();
Output(s_pre, s_in, len);
cout << endl;
}
return 0;
}