96. 不同的二叉搜索树 中等

给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。

示例 1:

输入:n = 3
输出:5

示例 2:

输入:n = 1
输出:1

提示:

  • 1 <= n <= 19

代码参考:

package main

import "fmt"

func main() {
    fmt.Println(numTrees(3)) // 5
}

// 有点类似斐波那契数列的味道
// 1 -> 1
// 2 -> 2
// 3 -> 1*2 + 1*1 + 2*1 = 5
// 4 -> 1*5 + 2*2 + 5*1 = 14
// ...
func numTrees(n int) int {
    dp := make([]int, n+1)
    dp[0], dp[1] = 1, 1
    for i := 2; i <= n; i++ {
        for j := 0; j < i; j++ {
            dp[i] += dp[j] * dp[i-j-1] // -1 是剔除本体 // 以 i 为根节点的 BST 数 = 两侧子 BST 数乘积
        }
    }
    return dp[n]
}
最后编辑: kuteng  文档更新时间: 2021-06-05 10:16   作者:kuteng