输入一颗二叉树的先序遍历和中序遍历,输出后序遍历序列;
样例输入输出:
DBACEGF ABCDEFG —> ACBFGED
BCAD CBAD —> CDAB
// 先序 = root + 左子序 + 右子序
中序 = 左子序 + root + 右子序
后序 = 左子序 + 右 子序 + root
#include "iostream"
#include "string"
#include "cstdio"
#include "cstring"
#include "cmath"
#include "map"
#include "stack"
#include "algorithm"
using namespace std;
string recovery(string s1,string s2) { //s1是先序,s2是中序,返回后序
if(s1.size() == 0) return ""; //结束条件写在前面
if(s1.size() == 1) return s1;
char root = s1[0]; // 根节点是先序的第一个节点
string l1,l2,r1,r2;
int len,k;
len = s2.size(); //先序与后序的总长度都是len
for(int i = 0; i < len; i++) {
if(s2[i] == root) { //找到root节点在中序中的位置,用k保存
k = i;
break;
}
}
for(int i = 1; i <= k; i++) l1 = l1+s1[i]; //左子序的先序
for(int i = k+1; i < len; i++) r1 = r1 + s1[i]; // 右子序的先序
for(int i = 0; i <= k-1; i++) l2 = l2 + s2[i]; // 左子序的中序
for(int i = k+1; i < len; i++) r2 = r2 + s2[i]; //右子序的中序
return recovery(l1,l2) + recovery(r1,r2) + root; //递归求后序,后序 = 排列好的左子序 + 排列好的右子序 + root;
}
int main(){
ios::sync_with_stdio(false);
string s1,s2;
while(cin >> s1 >> s2) {
cout << recovery(s1,s2) << endl;
}
return 0;
}