1.动态规划
对于有序娱乐1-n构建二叉搜索树,我们可以遍历,对数字i,将i作树根,则1--i-1构成其左子树,i+1--n构成其右子树。
设G(n):长度为n的序列构成的二叉搜索树的个数
F(i):以i为根节点的二叉搜索树个数
得到:G(n)=F(1)+F(2)+.......+F(n)
对于边界值,即n=0或1时,分别对应空树和只有根,则G(0)=G(1)=1.
对于F(i),即以i为根节点,其左子树有1---i-1构成,长度为(i-1);右子树右i+1---n构成,长度为(n-i),
得到F(i)=G(i-1)*(n-i)
即G(n)=G(0)*G(n-1)+G(1)*G(n-2)+...+G(i-1)*G(n-i)+....+G(n-1)*G(0).
由于G(n)依赖G(0)---G(n-1),故从小到大依次计算,
且初始化G(0)=G(1)=1
代码如下:
class Solution {
public:
int numTrees(int n) {
vector<int> res(n+1,0);
res[0]=1;
res[1]=1;
for(int i=2;i<=n;i++)
for(int j=1;j<=i;j++)
res[i]+=res[j-1]*res[i-j];
return res[n];
}
};
2.数学公式
右递归公式知为卡特兰数,https://baike.baidu.com/item/catalan/7605685?fr=aladdin
该数简单定义如下:
可自行编写代码