-
题目描述:
-
二叉树的前序、中序、后序遍历的定义:
前序遍历:对任一子树,先访问跟,然后遍历其左子树,最后遍历其右子树;
中序遍历:对任一子树,先遍历其左子树,然后访问根,最后遍历其右子树;
后序遍历:对任一子树,先遍历其左子树,然后遍历其右子树,最后访问根。
给定一棵二叉树的前序遍历和中序遍历,求其后序遍历(提示:给定前序遍历与中序遍历能够唯一确定后序遍历)。
-
输入:
-
两个字符串,其长度n均小于等于26。
第一行为前序遍历,第二行为中序遍历。
二叉树中的结点名称以大写字母表示:A,B,C....最多26个结点。
-
输出:
-
输入样例可能有多组,对于每组测试样例,
输出一行,为后序遍历的字符串。
-
样例输入:
-
ABC BAC FDXEAG XDEFAG
-
样例输出:
-
BCA XEDGAF
-
答疑:
解题遇到问题?分享解题心得?讨论本题请访问:http://t.jobdu.com/thread-7801-1-1.html
#include <cstdio>
#include <cstring>
const int maxn=105;
char pre[maxn],in[maxn];
struct node{
char data;
node* lch;
node* rch;
};
node* create(int prel,int prer,int inl,int inr){
if(prel>prer) return NULL;
node* root=new node;
root->data=pre[prel];
int k;
for(k=inl;k<=inr;k++) if(in[k]==pre[prel]) break;
int numleft=k-inl;
root->lch=create(prel+1,prel+numleft,inl,k-1);
root->rch=create(prel+numleft+1,prer,k+1,inr);
return root;
}
void postorder(node* root){
if(root==NULL) return;
postorder(root->lch);
postorder(root->rch);
printf("%c",root->data);
}
int main(){
while(scanf("%s%s",pre,in)==2){
int n=strlen(pre);
node* root=create(0,n-1,0,n-1);
postorder(root);
printf("\n");
}
return 0;
}