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