【剑指offer】有多少个不同的二叉搜索树 [Go语言]

98 阅读1分钟

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) 输出结果