力扣题解(不同的二叉搜索树)

96. 不同的二叉搜索树

给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。

思路:

首先明确二叉搜索树的概念,这和本题息息相关,如果不是二叉搜索树而是别的树,做法可能就会不一样了。二叉搜索树是对于任意节点k,要求所有左孩子节点小于k,右节点大于k。因此对于每个节点,可以清晰的把所有可以插入的节点分到左右子树中。

dp[i]表示有i个节点的种树(对于这种顺序不固定,对每个数有一定选择的题貌似很喜欢让dp表示总的个数而不是前i个个数什么的?)。dp[i]的组成是对于j属于1到i,所有dp[j-1]*dp[i-j]的和,可以看成是i个节点就是1到i所有的数,取一个数j为中间,然会分成左右子树两部分,左边的个数是j-1个,右边个数是i-j个,那就是dp[j-1]*dp[i-j]啦。需要注意的是,存在某一侧没有节点,即可能有左子树或者右子树是空树的情况,此时就是dp[0],因为是用的乘法,所以dp[0]=1,认为空树就一种组合方法。

class Solution {
public:
    int numTrees(int n) {
    vector<int>dp(n+1,0);
    dp[0]=1; 
    for(int i=1;i<=n;i++) //i表示节点个数
    { 
       for(int j=1;j<=i;j++)
       {
           int l=dp[j-1],r=dp[i-j];
           dp[i]+=l*r;
       } 
    }
  return dp[n];
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值