96.不同的二叉搜索树

46 阅读1分钟

题目:
给你一个整数 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) =i=1i=n\sum_{i=1}^{i=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]
}