动态规划-力扣96-不同的二叉搜索树

给定一个整数 n,求以 1 ... n 为节点组成的二叉搜索树有多少种?

示例:

输入: 3
输出: 5
解释:
给定 n = 3, 一共有 5 种不同结构的二叉搜索树:

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/unique-binary-search-trees
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

       对于这个题,我们可以首先找找规律,再决定递推式:

       我们使用t[i]来表示一共有i个节点时,不同的树的棵数。

       当 n=1时,毫无疑问只有一棵不同的树,t[1]=1。

       当n=2时,又可以分为两种情况,以1为根的时候,有一棵不同的树,以2为根的时候,有一棵不同的树,故n=2时,有两棵不同的树,t[2] = 2。

       当n=3时,可以分为3种情况,以1为根的时候,其子节点都在根的右边,此时其子树等于n=2的情况,只是节点的值不同,以2为根的时候,其子节点在其两边,一边一个,此时所有不同的树的棵树等于左边乘以右边,即t[1] * t[1] = 1,以3为根的时候,其子节点都在左边,此时其子树等于n=2的情况,故t[3] = 2*t[2] + t[1]*t[1] = 5。

      当n=4时,可以分为4种情况,以1为根的时候,其子节点都在根的右边,此时其子树等于n=3的情况,只是节点的值不同,以2为根的时候,其子节点在其两边,左边一个右边两个,此时所有不同的树的棵树等于左边乘以右边,即t[1] * t[2] = 2,以3为根的时候,其子节点在其两边,左边两个右边一个,此时所有不同的树的棵树等于左边乘以右边,即t[2] * t[1] = 2,以4为根的时候,其子节点都在左边,此时其子树等于n=3的情况,故t[4] = 2*t[3] + t[1]*t[2] +t[2]*t[1] = 14。

      ……

      直到这里,我们就可以发现递推的规律了,即:

      t[n] = SUM(2 * t[i-1] +SUM( t[j-1]*t[i-j] )) i从3到n,n>=3,j从2到i-1。

     代码如下:

 

class Solution {
    public int numTrees(int n) {
        if(n==1){
            return 1;
        }
        if(n==2){
            return 2;
        }
        int g[] = new int[n+1];
        g[1] = 1;
        g[2] = 2;
        for(int i = 3;i<=n;i++){
            g[i] = g[i] +2*g[i-1];
            for(int j = 2;j<i;j++){
                g[i] +=g[j-1]*g[i-j];
            }
        }
        return g[n];
    }
}

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值