P1229 遍历问题

在这里插入图片描述
这道题其实很简单,看着挺复杂。其实是用来唬人的

先想一下,为什么给定中序和前序 或者 中序和后续就能唯一确定一颗二叉树?

答案是:可以每次由前序 或者 后续确定树的根节点,然后去中序中去寻找这个根节点,这样就可以划分出左子树和右子树了。但是前序和后续就没办法确定,我们无法对其进行划分。那么是什么导致前序和后续不能确定中序呢?

在这里插入图片描述

如图所示的二叉树,其前序:ABC,后续:BCA,他的中序是唯一的~

在这里插入图片描述
如图所示,其前序:ABDEC,后续:DEBCA 其中序也是唯一的,要是能找出其他的举个反例??
我们通过观察分析可以得到,只有出现某一个节点为根节点,其有且只有一个子树的时候。前序和后续才不能确定一颗二叉树,换句话说:一颗树除叶子节点外如果其他所有根节点都有两棵子树,那么是可以根据前序和后续来确定一颗二叉树的,其一定是唯一。但是如果有一个子树的情况是不行的~

在这里插入图片描述

如图所示,其前序:ABDC,后续:DBCA

在这里插入图片描述

其前序ABDC,后续:DBCA.

可以看到上面两个不同的树其前序和后续相同,但是其中序却有两种不同的结果~

问题就转换为~我们求树中有多少个根节点,其有且只有一个根节点,设这样的根节点为n,那么可以得到不同的中序序列为2n种(2n个不同树)

那么如何根据前序和后续序列去寻找这样的根节点呢,很简单。我们看看上面的哪个序列:ABDC,DBAC

设str1=ABDC,str2=DBCA,我们只需要找到str1[i]==str[j]&&str1[I+1]==str[j-1],即可,找到一个点就在原来的基础上*2,下面是AC代码~

#include<iostream>
using namespace std;
    int main()
    {
        string str1,str2;//前序和后序
        cin>>str1>>str2;
        int sum=1;
        for(int i=0;i<str1.size();i++)
        {
            for(int j=0;j<str2.size();j++)
            {
                if(i+1<str1.size()&&j-1>=0&&str1[i]==str2[j]&&str1[i+1]==str2[j-1])
                {
                    sum<<=1;
                }
            }
        }
        cout<<sum<<endl;
        return 0;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值