这道题其实很简单,看着挺复杂。其实是用来唬人的
先想一下,为什么给定中序和前序 或者 中序和后续就能唯一确定一颗二叉树?
答案是:可以每次由前序 或者 后续确定树的根节点,然后去中序中去寻找这个根节点,这样就可以划分出左子树和右子树了。但是前序和后续就没办法确定,我们无法对其进行划分。那么是什么导致前序和后续不能确定中序呢?
如图所示的二叉树,其前序: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;
}