您的位置:首页 > 其它

uva 563 Tree Recovery

2015-12-07 21:14 176 查看
输入一颗二叉树的先序遍历和中序遍历,输出后序遍历序列;

样例输入输出:

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: