二叉树的遍历2

文章描述了一个关于二叉树的问题,其中主角小Valentine想要通过后序和中序遍历的字符串来重构二叉树。她意识到这个过程可以用来唯一确定一棵树,但手动操作繁琐,所以寻求编写程序来自动化这个过程。示例输入和输出展示了如何使用递归方法实现这个功能。
摘要由CSDN通过智能技术生成

小Valentine非常喜欢玩二叉树,她喜欢的游戏是随意构造一颗二叉树,用大写字母编号标识结点。下图是她构造的二叉树中的一棵:

                              D

                             / \ 

                            B   E 

                          / \    \  

                        A     C   G

                                 /

                                F

为了向她的后代记录她所创建的树,她给每棵树写下两串字符串,表示后序遍历(左子树,右子树,根)和中序遍历(左子树,根,右子树)的结果。

对于上面的树,后序遍历的结果是ACBFGED,中序遍历的结果是ABCDEFG。

她认为这样的一对字符串给出了重构这棵树的足够的信息(但她从来没有尝试去重构二叉树)。

过了好些年,她认识到重构这些树的确是可能的。对于同一棵树,同一个字母不会用两次。

然而,如果手工完成重构二叉树,那是非常乏味的。因此,请您编写一个程序来为她完成这一项工作。

Sample Input

ACBFGED ABCDEFG
CDAB CBAD

Sample Output
DBACEGF
BCAD
#include<bits/stdc++.h>
  
using namespace std;
  
void tree( string x, string y )
{
    if( y.size() <= 0 )
    {
        return ;
    }
      
    int tmp = x.find( y[y.size() - 1 ] );
      
    cout << y[ y.size() - 1 ];
      
    tree( x.substr( 0, tmp ), y.substr( 0, tmp ) );
    tree( x.substr( tmp + 1 ), y.substr( tmp, y.size() - tmp - 1 ) );
      
    return ;
}
  
int main()
{
    string x, y;
      
    while( cin >> x >> y )
    {
        tree( y, x );
        cout << endl;
    }
      
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值