不同的二叉搜索树
难度:
标签:
题目描述
给你一个整数 n
,求恰由 n
个节点组成且节点值从 1
到 n
互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。
示例 1:
输入:n = 3 输出:5
示例 2:
输入:n = 1 输出:1
提示:
1 <= n <= 19
代码结果
运行时间: 40 ms, 内存: 14.8 MB
/*
* 问题描述:给定一个整数 n,求由 n 个节点组成且节点值从 1 到 n 互不相同的二叉搜索树的种数。
*
* 题目思路:
* 1. 使用动态规划来解决这个问题。
* 2. 定义一个数组 dp,其中 dp[i] 表示有 i 个节点的二叉搜索树的种数。
* 3. 对于每个节点作为根节点时,左子树的节点数为 j-1,右子树的节点数为 i-j。
* 4. 使用 Java Stream API 计算 dp 数组。
* 5. 最终结果是 dp[n]。
*/
import java.util.stream.IntStream;
public class UniqueBSTStream {
public int numTrees(int n) {
int[] dp = new int[n + 1];
dp[0] = 1;
dp[1] = 1;
IntStream.range(2, n + 1).forEach(i -> {
dp[i] = IntStream.range(1, i + 1)
.map(j -> dp[j - 1] * dp[i - j])
.sum();
});
return dp[n];
}
}
解释
方法:
这个题解使用动态规划的思路来解决问题。定义 dp[i] 表示具有 i 个节点的不同二叉搜索树的个数。对于 i 个节点,可以枚举根节点的位置 j(从1到i),那么左子树就有 j-1 个节点,右子树有 i-j 个节点。由于左右子树也都是二叉搜索树,因此可以递归地计算它们的个数,然后相乘得到以 j 为根节点的二叉搜索树的个数。最后将所有 j 的情况累加起来,就得到了 i 个节点的不同二叉搜索树的总数。
时间复杂度:
O(n^2)
空间复杂度:
O(n)
代码细节讲解
🦆
在定义 dp 数组时,为什么 dp[0] 被初始化为 1?空树在二叉搜索树的定义中有什么特殊意义?
▷🦆
dp 数组中的递推公式 dp[i] += dp[j-1] * dp[i-j] 是如何确保二叉搜索树的性质不被破坏的?
▷🦆
在递归计算树的数量时,是否有重复计算的情况?如果有,动态规划是如何解决这个问题的?
▷🦆
在实际应用中,如何解释当 n 增大时 dp 数组中各值的增长趋势?
▷