题目:
给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。
算法:
满足题意的二叉搜索树的种数:G(n)
以i为root节点的BST的个数:f(i)
G(n) = f(1) + f(2) + f(3) +... + f(n)
以i为root节点的BST个格数:左侧i - 1个数构成BST的个数 * 右侧n - i个数构成BST的个数:
f(n) = G(i - 1) * G(n - i)
得到动态规划公式:
G(n) =G(i - 1) * G(n - i)
func numTrees(n int) int {
G := make([]int, n + 1)
G[0] = 1
G[1] = 1
for i := 2; i <= n; i ++ {
for j := 1; j <= i; j ++ {
G[i] = G[i] + G[j - 1] * G[i - j]
}
}
return G[n]
}