8:重建二叉树
-
总时间限制:
- 1000ms 内存限制:
- 65536kB
-
描述
-
给定一棵二叉树的前序遍历和中序遍历的结果,求其后序遍历。
输入
-
输入可能有多组,以EOF结束。
每组输入包含两个字符串,分别为树的前序遍历和中序遍历。每个字符串中只包含大写字母且互不重复。
输出
- 对于每组输入,用一行来输出它后序遍历结果。 样例输入
-
DBACEGF ABCDEFG BCAD CBAD
样例输出
-
ACBFGED CDAB
提示
- 以英文题面为准
-
#include<iostream> #include<cmath> #include<cstring> #include<algorithm> #include<iomanip> #include<queue> #include<stack> #include<vector> #include<set> #include<map> using namespace std; string Mid; string Pre; struct Node { char x; Node*left; Node*right; Node() { x='A';left=NULL;right=NULL; } }; Node*root; Node*Build(int s1,int e1,int s2,int e2) { Node*p=new Node(); if(s1==e1) { p->x=Mid[s1];return p; } int t; for(t=s1;t<=e1;++t) { if(Mid[t]==Pre[s2])break; } p->x=Mid[t]; if(t==s1) { p->right=Build(s1+1,e1,s2+1,e2); } else if(t==e1) { p->left=Build(s1,e1-1,s2+1,e2); } else { p->left=Build(s1,t-1,s2+1,t-s1+s2); p->right=Build(t+1,e1,t+1-e1+e2,e2); } return p; } void Last(Node*p) { if(p==NULL)return; Last(p->left); Last(p->right); cout<<p->x; } int main() { while(cin>>Pre>>Mid) { int len=Pre.length(); root=Build(0,len-1,0,len-1); Last(root); cout<<endl; } return 0; }
-