[九度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] = '\0';

26           printf("%s\n",post);                             

27      }

28      return 0;     

29 }
View Code
  

你可能感兴趣的:(二叉树)