每日一题之不同的二叉搜索树

文章讲述了如何使用动态规划方法解决给定整数n下构建二叉搜索树的计数问题,通过定义dp[i]表示i个节点的二叉搜索树数目,并给出递推公式dp[i]=dp[j-1]+dp[i-j],最终计算n个节点的可能树种数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

示例:

 这题同样是动态规划,我们用dp[i]表示i个节点的二叉搜索树数目,当i=0时,二叉树的数目为一,当i=1时,二叉树的数目为1,由此我们可以推断当n为3时,就是 元素1为头结点搜索树的数量 + 元素2为头结点搜索树的数量 + 元素3为头结点搜索树的数量

元素1为头结点搜索树的数量 = 右子树有2个元素的搜索树数量 * 左子树有0个元素的搜索树数量

元素2为头结点搜索树的数量 = 右子树有1个元素的搜索树数量 * 左子树有1个元素的搜索树数量

元素3为头结点搜索树的数量 = 右子树有0个元素的搜索树数量 * 左子树有2个元素的搜索树数量

所以dp[i]=dp[j-1]+dp[i-j]

具体代码如下:

func numTrees(n int) int {
dp:=make([]int,n+1)
dp[0]=1
for i:=1;i<=n;i++{
    for j:=1;j<=i;j++{
        dp[i]+=dp[j-1]*dp[i-j]//左子树个数乘以右子树个数
    }
}
return dp[n]
}

其中j-1表示以j为头结点的左子树个数,i-j表示以j为头结点的右子树的个数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值