不同的二叉搜索树(递推)

在这里插入图片描述
拿到这个题目,首先就定位到,这肯定是一个找规律的题目,也就可以使用递推(动态规划的解法进行解决)。
然后开始疯狂找规律,其实给的这个图简化了这个题目,不然还真的不好想。

我们可以仔细分析一下样例3 这个图,二叉搜索树的树根将其余的节点分成了左右两棵字数,那么我们可以遍历树根,每一种树根的左右子树的节点树是固定的。

那么这个题目抽象一下:一个n个节点的二叉搜索树,根节点的可能性为1 ~ n ,那么递推公式就出来了

dp[i] += dp[j -1] * dp[i - j];其中j是遍历1 ~ i;
那么这个代码就很简单了:

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

在这里插入图片描述
整个推理大概耗时7分钟,一遍过还算比较满意。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大鱼qss

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值