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

发布于:2023-10-24 ⋅ 阅读:(95) ⋅ 点赞:(0)

给定一个整数 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为头结点的右子树的个数
 


网站公告

今日签到

点亮在社区的每一天
去签到