- 原题链接:http://ac.jobdu.com/problem.php?pid=1078
- 题目描述:
-
二叉树的前序、中序、后序遍历的定义:
前序遍历:对任一子树,先访问跟,然后遍历其左子树,最后遍历其右子树;
中序遍历:对任一子树,先遍历其左子树,然后访问根,最后遍历其右子树;
后序遍历:对任一子树,先遍历其左子树,然后遍历其右子树,最后访问根。
给定一棵二叉树的前序遍历和中序遍历,求其后序遍历(提示:给定前序遍历与中序遍历能够唯一确定后序遍历)。
- 输入:
-
两个字符串,其长度n均小于等于26。
第一行为前序遍历,第二行为中序遍历。
二叉树中的结点名称以大写字母表示:A,B,C....最多26个结点。
- 输出:
-
输入样例可能有多组,对于每组测试样例,
输出一行,为后序遍历的字符串。
- 样例输入:
-
ABC BAC FDXEAG XDEFAG
- 样例输出:
-
BCA XEDGAF
- 来源:2006年清华大学计算机研究生机试真题
- 题解:
- 这道题是一道非常简单的二叉树重建问题。代码如下:
1 #include <cstdio> 2 #include <string.h> 3 using namespace std; 4 5 char pre[30]; 6 char in[30]; 7 char post[30]; 8 9 void build(int n,char *s1,char *s2,char*s) 10 { 11 if(n<=0) return; 12 int p = strchr(s2,s1[0]) - s2; 13 build(p,s1+1,s2,s); 14 build(n-p-1,s1+p+1,s2+p+1,s+p); 15 s[n-1] = s1[0]; 16 } 17 int main() 18 { 19 //freopen("1078.in","r",stdin); 20 //freopen("1078.out","w",stdout); 21 while(scanf("%s%s",pre,in) == 2) 22 { 23 int n = strlen(pre); 24 build(n,pre,in,post); 25 post[n] = '