2255:重建二叉树
-
总时间限制:
- 1000ms 内存限制:
- 65536kB
-
描述
-
给定一棵二叉树的前序遍历和中序遍历的结果,求其后序遍历。
输入
-
输入可能有多组,以EOF结束。
每组输入包含两个字符串,分别为树的前序遍历和中序遍历。每个字符串中只包含大写字母且互不重复。
输出
- 对于每组输入,用一行来输出它后序遍历结果。 样例输入
-
DBACEGF ABCDEFG BCAD CBAD
样例输出
-
ACBFGED CDAB
提示
以英文题面为准
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct Tree{
char val;
Tree * left, * right;
Tree(char v):val(v),left(NULL),right(NULL){}
};
char pre[30],in[30];
void buildTree(Tree * &root, int s1,int len1,int s2){
if(len1 > 0){
root = new Tree(pre[s1]);
int j = s2;
while(in[j] != pre[s1]) j++;
buildTree(root->left, s1 + 1, j - s2, s2);
buildTree(root->right, s1+j-s2+1, len1 - j + s2 - 1, j + 1);
}else{
root = NULL;
return ;
}
}
void postOrder(Tree * root){
if(root != NULL){
postOrder(root->left);
postOrder(root->right);
putchar(root->val);
}
}
int main(){
while(~scanf("%s%s",pre,in)){
int len = strlen(pre);
Tree * root;
buildTree(root,0,len,0);
postOrder(root);
putchar('\n');
}
return 0;
}