leetcode不同的二叉搜索树

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

该数简单定义如下:

可自行编写代码

发布了191 篇原创文章 · 获赞 3 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_38196982/article/details/104734274