问题描述:中序序列为X的二叉树,共有多少种可能的前序序列
(1) X={1,2,3,4}
(2) X={1,2,3,4,5,6,7,8,9,10}
已知:由确定的中序序列和前序序列可以唯一确定二叉树,且一个确定的二叉树其中序序列和前序序列也是唯一的,所以原问题可以变成:对于给定的中序序列,一共由多少种可能的二叉树
尝试总结递推公式:
X长度 | 1 | 2 | 3 |
可能的树 | 1 | 2*1 | 2*2+1*1 |
对于更长的序列,根据根节点位置不同,可拆分成两个子树
例如,长度位h的中序序列,其可能的树结构由 N(h)种
假如其第i位为根节点,则总的可能有: N(i-1)* N(h-i)种
所以递推公式: N(0)=N(1)=1,N(2)=2
N(h): N_h=0;
For(int i=1;i<=h;i++) N_h+=N(i-1)*N(h-i)
代码实现:
#include<iostream>
using namespace std;
int TreeNum(int len){
if(len==0||len==1) return 1;
if(len==2) return 2;
int count=0;
for(int i=1;i<=len;i++) count+=TreeNum(i-1)*TreeNum(len-i);
return count;
}
int main(){
int a=0, b=0;
cin>>a;
cin>>b;
cout<<" TreeNum("<<a<<")="<<TreeNum(a)<<endl;
cout<<" TreeNum("<<b<<")="<<TreeNum(b)<<endl;
system("pause");
return 0;
}
输出:
最后补充一下,这个问题到递推公式这里:N(h)=ΣN(i-1)*N(h-i) ,其实是卡特兰数,和栈混洗问题结果相同。但是两种遍历过程中和栈混洗有何联系,是否与中序遍历、先序遍历的栈如栈出有关,这点由于学的不够深入还想不太明白,有感兴趣的同学欢迎讨论。wink