news 2026/5/29 16:56:29

不同的二叉搜索树:从动态规划到卡特兰数

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
不同的二叉搜索树:从动态规划到卡特兰数

一、题目描述

给定整数:

n

要求:

使用 1 ~ n 这 n 个不同节点 构造所有可能的二叉搜索树(BST)

返回:

不同 BST 的数量

例如:


示例 1

输入:

n = 3

输出:

5

对应的五种 BST:


示例 2

输入:

n = 1

输出:

1

二、问题本质

这道题不是让你:

构造具体树

而是:

统计有多少种不同结构

因此核心问题变成:

BST 的结构数量如何计算?

三、二叉搜索树的关键性质

BST 满足:

左子树所有节点 < 根节点 右子树所有节点 > 根节点

因此:

如果选择:

i

作为根节点。

那么:

左子树: 1 ~ i-1 右子树: i+1 ~ n

节点数量分别为:

左子树节点数 = i-1 右子树节点数 = n-i

四、最核心的思想:分治

假设:

f(n)

表示:

n 个节点能够构造的 BST 数量

如果:

i 作为根节点

那么:


左子树有:

f(i-1)

种构造方式。

右子树有:

f(n-i)

种构造方式。

由于:

左右子树相互独立

根据乘法原理:

当前根节点的 BST 数量 = f(i-1) * f(n-i)

枚举所有根节点:

i = 1 ~ n

所以:

f(n) = Σ f(i-1) * f(n-i)

即:

f(n) = f(0)*f(n-1) + f(1)*f(n-2) + ... + f(n-1)*f(0)

这就是:

卡特兰递推公式

五、动态规划推导

定义:

dp[i]

表示:

i 个节点构成 BST 的数量

状态转移方程

dp[i] += dp[j-1] * dp[i-j]

其中:

j 表示根节点

六、为什么是乘法?

例如:

左子树有 2 种 右子树有 3 种

那么:

总方案数 = 2 × 3 = 6

因为:

每一种左子树:

都能和

每一种右子树:

自由组合

这是经典:

组合计数

思想。


七、边界条件


dp[0] 为什么是 1?

这是本题最容易疑惑的地方。

dp[0] = 1

表示:

空树也算一种 BST

为什么?

因为:

例如:

只有左子树 没有右子树

时:

我们需要:

左子树方案数 × 空树方案数

如果:

dp[0] = 0

会导致:

整个结果变成 0

数学上不合理。

因此:

空结构也算一种合法情况

dp[1]

dp[1] = 1

只有一个节点:

只能构造一种 BST

八、动态规划代码实现

#include <iostream> #include <vector> using namespace std; class Solution { public: int numTrees(int n) { vector<int> dp(n + 1, 0); // 边界条件 dp[0] = 1; dp[1] = 1; // 计算 dp[i] for (int i = 2; i <= n; i++) { // 枚举根节点 for (int j = 1; j <= i; j++) { dp[i] += dp[j - 1] * dp[i - j]; } } return dp[n]; } };

九、完整推导过程(n = 3)


dp[0]

1

dp[1]

1

dp[2]

枚举根:


根 = 1

左:

0 个节点

右:

1 个节点

方案:

dp[0] * dp[1] = 1 * 1 = 1

根 = 2

左:

1 个节点

右:

0 个节点

方案:

dp[1] * dp[0] = 1 * 1 = 1

因此:

dp[2] = 2

dp[3]


根 = 1

dp[0] * dp[2] = 1 * 2 = 2

根 = 2

dp[1] * dp[1] = 1

根 = 3

dp[2] * dp[0] = 2

总和:

2 + 1 + 2 = 5

因此:

dp[3] = 5

十、卡特兰数正式登场

你会发现:

1 1 2 5 14 42 132 ...

这就是著名的:

Catalan Number(卡特兰数)

十一、什么是卡特兰数?

卡特兰数是组合数学中极其经典的一类计数序列。

定义:

C0 = 1 Cn = Σ Ci * C(n-1-i)

即:

Cn = C0Cn-1 + C1Cn-2 + ... + Cn-1C0

与本题完全一致。


十二、卡特兰数经典问题

卡特兰数会频繁出现在:


1. 不同 BST 数量

本题。


2. 合法括号序列数量

例如:

n 对括号有多少种合法组合

3. 出栈序列数量

例如:

n 个元素有多少种合法出栈顺序

4. 满二叉树结构数量


5. 凸多边形三角划分


6. Dyck Path


它是算法竞赛中最经典的组合计数之一。


十三、卡特兰数通项公式

除了 DP:

还有数学公式:

C_n = \frac{1}{n+1}\binom{2n}{n}

也可以写成:

C_n = \binom{2n}{n} - \binom{2n}{n-1}


十四、为什么会出现卡特兰数?

因为 BST 的构造过程满足:

根节点划分左右区间 左右子树递归独立

这种:

递归划分结构

是卡特兰数最典型的特征。


十五、数学公式代码(组合数)

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; } };

十六、为什么动态规划更适合面试?

虽然公式法更快。

但是:

面试官更关注:

状态定义 递推关系 分治思想

因此:

DP 解法最推荐

因为它体现了:

问题拆解能力

十七、复杂度分析


动态规划

状态数:

n

每个状态枚举:

n

时间复杂度:

O(n²)

空间复杂度:

O(n)

数学公式

时间复杂度:

O(n)

空间复杂度:

O(1)

十八、常见错误总结


错误1:dp[0] 写成 0

这是最经典错误。

正确:

dp[0] = 1

因为:

空树也算一种情况

错误2:左右子树写成加法

错误:

dp[i] += dp[left] + dp[right]

正确:

dp[i] += dp[left] * dp[right]

因为:

左右子树独立组合

错误3:循环边界错误

根节点:

1 ~ i

不要漏掉:

i

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/29 16:54:03

7个技术突破让经典暗黑2在现代PC上重获新生

7个技术突破让经典暗黑2在现代PC上重获新生 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你是否还记得那个在640480分辨率…

作者头像 李华
网站建设 2026/5/29 16:54:00

跨境电商 Lorenza Scarsi 版权侵权案,Keith 律所 TRO 维权解析!

案件参数 案号&#xff1a;26-cv-5819、26-cv-5508 品牌方&#xff1a;Lorenza Scarsi 起诉类型&#xff1a;版权 代理律所&#xff1a;Keith 起诉时间&#xff1a;2026/5/19、2026/5/13 起诉地&#xff1a;美国伊利诺伊州 注册版权&#xff1a; 原告是一位自由插画师和…

作者头像 李华
网站建设 2026/5/29 16:53:30

电路设计入门:从欧姆定律到PCB实战,构建你的第一个LED闪烁器

1. 项目概述&#xff1a;从零开始的电路设计之旅如果你对电子设备内部那些密密麻麻的线路和元器件感到好奇&#xff0c;想知道它们是如何被“设计”出来的&#xff0c;那么你找对地方了。电路设计&#xff0c;听起来像是电子工程师的专属领域&#xff0c;充满了复杂的公式和抽象…

作者头像 李华
网站建设 2026/5/29 16:50:59

5分钟掌握Windows和Office永久激活的终极解决方案

5分钟掌握Windows和Office永久激活的终极解决方案 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 你是否厌倦了频繁弹出的激活提醒&#xff1f;是否在关键时刻发现Office变成了只读模式&#xf…

作者头像 李华
网站建设 2026/5/29 16:49:59

Chrome默认下载路径修改指南:从基础设置到自动化管理

1. 项目概述与核心价值每次从网上下载个文件&#xff0c;结果一不留神就跑到C盘的“下载”文件夹里&#xff0c;等想起来要找的时候&#xff0c;桌面已经堆满了各种安装包、图片和文档&#xff0c;这场景是不是特别熟悉&#xff1f;对于每天要和大量文件打交道的开发者、设计师…

作者头像 李华
网站建设 2026/5/29 16:48:46

3大突破性革新:TrollInstallerX如何重新定义iOS越狱安装体验

3大突破性革新&#xff1a;TrollInstallerX如何重新定义iOS越狱安装体验 【免费下载链接】TrollInstallerX A TrollStore installer for iOS 14.0 - 16.6.1 项目地址: https://gitcode.com/gh_mirrors/tr/TrollInstallerX 你是否曾为iOS设备上繁琐的TrollStore安装流程而…

作者头像 李华