96. 不同的二叉搜索树

目录

96. 不同的二叉搜索树

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

https://markdown-1303167219.cos.ap-shanghai.myqcloud.com/image-20220317201424161.png

DP

https://markdown-1303167219.cos.ap-shanghai.myqcloud.com/image-20220317201731346.png

每次只遍历一半会更快。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
func numTrees(n int) int {
	dp := make([]int, n+1)
	dp[0], dp[1] = 1, 1
	for i := 2; i <= n; i++ {
		for j := 1; j <= i/2; j++ {
			// 遍历每一个结点作为头节点 因为是对称的情况所以可以遍历一半
			dp[i] += dp[j-1] * dp[i-j]
		}
		dp[i] *= 2
		if i%2 == 1 {
			// 单独处理奇数的情况
			dp[i] += dp[i/2] * dp[i/2]
		}
	}
	return dp[n]
}

https://markdown-1303167219.cos.ap-shanghai.myqcloud.com/image-20220317201930778.png

递归

思路一致,不过超时了……

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
// 易于理解的递归思路
func numTrees(n int) int {
	if n == 1 || n == 0 {
		return 1
	}
	sum := 0
	for i := 1; i <= n; i++ {
        // 遍历每一个结点作为头结点
		sum += numTrees(i-1) * numTrees(n-i)
	}
	return sum
}