不同的二叉搜索树 | LeetCode-96 | 动态规划

动态规划练习题

LeetCode链接:96. 不同的二叉搜索树

1.题目描述

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

示例 1:

image-20240924174531055

1
2
输入:n = 3
输出:5

示例 2:

1
2
输入:n = 1
输出:1

提示:

  • 1 <= n <= 19

2.题解

2.1 动态规划

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class Solution {
// 定义一个公共方法 numTrees,它接受一个整数 n 作为参数
public int numTrees(int n) {
// 初始化一个动态规划数组,长度为 n + 1,并且所有元素初始化为 0
int[] dp = new int[n + 1];

// 边界条件:0个节点和1个节点的情况下,只有一种构建BST的方式
dp[0] = 1;
dp[1] = 1;

// 从 2 开始遍历到 n
for (int i = 2; i <= n; i++) {
// 遍历所有可能的根节点值 j(从 0 到 i-1)
for (int j = 0; j < i; j++) {
// dp[i] 表示 i 个节点的不同BST数量
// 对于每一个根节点 j,左子树有 j 个节点,右子树有 i - 1 - j 个节点
// 根据组合公式,累加 dp[j] 和 dp[i - 1 - j] 的乘积
dp[i] += dp[j] * dp[i - 1 - j];
}
}

// 返回 n 个节点的不同BST数量
return dp[n];
}
}

2.2 数学

  • 卡塔兰数:

    $C_0=1,\quad C_{n+1}=\frac{2(2n+1)}{n+2}C_n$

1
2
3
4
5
6
7
8
9
10
class Solution {
public int numTrees(int n) {
// 提示:我们在这里需要用 long 类型防止计算过程中的溢出
long C = 1;
for (int i = 0; i < n; ++i) {
C = C * 2 * (2 * i + 1) / (i + 2);
}
return (int) C;
}
}
-------------本文结束感谢您的阅读-------------