Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情
描述
给定一个由节点值从 1 到 n 的 n 个节点。请问由多少种不同的方法用这 n 个节点构成互不相同的二叉搜索树。
数据范围: 1≤n≤19
输入描述:
仅一行输入一个正整数 n ,表示节点的数量。
输出描述:
输出组成不同二叉搜索树的方法数。
示例1
输入:
3
输出:
5
示例2
输入:
2
输出:
2
思路
n=0时为空树,因为空树也算是二叉查找树的一种所以个数为1
n>=1时,二叉查找树的个数等于根节点左子树个数*根节点右子树个数
dp[n]记录0~n对应的二叉查找树的个数
n==0时,空树同样也是二叉搜索树
dp[0]=1
n==1时,根节点只能是1
dp[1]=dp[0]*dp[0]
n==2时,根节点可以是1和2
dp[2]=dp[0]*dp[1]+dp[1]*dp[0]
n==3时,根节点可以是1、2、3
dp[3]=dp[0]*dp[2]+dp[1]*dp[1]+dp[2]*dp[0]
由此可以推出卡塔兰数列的递推式
AC Code
func main(){
var n int
(1) fmt.Scan(&n)
(2) dp := make([]int,n+1)
(3) dp[0]=1
(4) for i:=0;i<n;i++{
(5) for j:=0;j<=i;j++{
(6) dp[i+1] += dp[j]*dp[i-j]
}
}
fmt.Print(dp[n])
}
- (1) 输入n
- (2) 初始化这个dp数组
- (3) 初始化初值
- (4) 循环每一个可能是根节点的元素
- (5) 状态转移方程
- (6) 输出结果