zoukankan      html  css  js  c++  java
  • [九度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
Copyright © 2011-2022 走看看