zoukankan      html  css  js  c++  java
  • POJ 2255 Tree Recoveryw(二叉树)

    题目原网址:http://poj.org/problem?id=2255

    题目中文翻译:

    Description

           小瓦伦丁非常喜欢玩二叉树。 她最喜欢的游戏是用大写字母构造的随机二叉树。

    这是她的一个创作的例子:

                                                   D
                                                  /
                                                 /  
                                                B     E
                                               /     
                                              /       
                                             A     C     G
                                                        /
                                                       /
                                                      F

        为了为后代记录她的树,她为每棵树写了两个字符串:前序遍历(根,左子树,右子树)和中序遍历(左子树,根,右子树)。 对于上面绘制的树,前序遍历是DBACEGF,中序遍历是ABCDEFG。

    她认为这样一对字符串会提供足够的信息来重建树(但她从未尝试过)。

    现在,多年以后,再次看到这些字符串,她意识到重建树确实是可能的,因为她从未在同一棵树上使用过两次相同的字母。

    然而,手工重建很快就变得单调乏味。

    所以现在她要求你写一个为她工作的程序!

    Input

    输入将包含一个或多个测试用例。

    每个测试用例由一行包含两个字符串preord和inord,表示二叉树的前序遍历和中序遍历。 两个字符串都由不重复的大写字母组成。 (因此它们不超过26个字符。)

    输入由文件结束(EOF)终止。

    Output

    对于每个测试用例,恢复瓦伦丁的二叉树并打印一行树的后序遍历(左子树,右子树,根)。

    Sample Input

    DBACEGF ABCDEFG

    BCAD CBAD

    Sample Output

    ACBFGED

    CDAB

     解题思路:

    通过先序遍历找到根,再根据中序遍历性质(一个节点的左儿子一定在它前面出现,而右儿子一定在它后面),找出这个节点的左右儿子,建树,最后输出后序遍历.

    AC代码:

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<string>
     4 #include<algorithm>
     5 #include<cstring>
     6 
     7 using namespace std;
     8 
     9 char q[30],z[30];
    10 int xb;
    11 
    12 void work(int l,int r) {
    13     char a;
    14     int i;
    15     if(l > r) return ;
    16     a = q[xb++];
    17     for(i = l;i <= r; i++)
    18         if(a == z[i])
    19             break;
    20     work(l,i - 1);
    21     work(i + 1,r);
    22     cout << a;
    23 }
    24 
    25 int main()
    26 {
    27     while(scanf("%s%s",q,z) != EOF) {
    28         getchar();
    29         int len = strlen(z);
    30         xb = 0;
    31         work(0,len-1);
    32         cout << endl;
    33     }
    34     
    35     return 0;
    36 }
  • 相关阅读:
    Silverlight 操作Excel 中的进程资源释放问题
    Silverlight DataGridTemplateColumn 中绑定事件
    Silverlight 设置DataGrid中行的提示信息
    判断Excel单元格中是否有错
    读取配置文件生成简单的网站导航菜单
    HTTP 错误 500.21 Internal Server Error
    忽然有用到DataSet,标记学习一下
    Silverlight读取包含中文的txt(解决乱码问题)
    for/foreach/linq执行效率测试
    将object强制转换成int效率测试
  • 原文地址:https://www.cnblogs.com/lipeiyi520/p/10739498.html
Copyright © 2011-2022 走看看