[九度OJ]1078.二叉树的遍历(重建)

原题链接: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] = '';
26           printf("%s
",post);                             
27      }
28      return 0;     
29 }
View Code
  
原文地址:https://www.cnblogs.com/codershell/p/3321031.html