463 字
2 分钟
不同的二叉搜索树

题目描述#

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

解题思路#

  1. 动态规划核心
    • 定义 dp[i] 表示 i 个节点组成的BST数量
    • 递推公式:dp[i] = Σ(dp[j] * dp[i-j-1])j 为左子树节点数
  2. 状态转移原理
    • 枚举每个节点作为根节点
    • 左子树节点数 j(0≤j<i),右子树节点数 i-j-1
  3. 边界条件
    • dp = 1(空树)
    • dp = 1(单节点树)
  4. 计算顺序
    • 自底向上计算 dp 到 dp[n]
    • 避免重复计算子问题

关键洞察#

  1. 独立子树原理
    • 二叉搜索树的左右子树结构相互独立
    • 组合数 = 左子树方案 × 右子树方案
  2. 卡特兰数特性
    • 该问题是卡特兰数的经典应用
    • 解为 C(2n,n)/(n+1)
  3. 对称性利用
    • dp[j] 和 dp[i-j-1] 可互换
    • 避免重复计算相同规模子问题
  4. 空间优化
    • 仅需一维数组存储中间结果
    • 无需记录完整树结构

复杂度分析#

指标说明
时间复杂度O(n²):双重循环计算dp数组
空间复杂度O(n):存储dp数组

代码实现#

/**
* @link {https://leetcode.cn/problems/unique-binary-search-trees/}
* @param {number} n
* @return {number}
*/
var numTrees = function (n) {
const dp = Array(n + 1).fill(0);
dp[0] = 1;
for (let i = 1; i <= n; i++) {
for (let j = 0; j < i; j++) {
dp[i] += dp[j] * dp[i - 1 - j];
}
}
return dp[n];
};

实际应用场景#

  1. 数据库索引优化:不同平衡BST结构的性能比较`
  2. 编译器设计: 语法分析树的结构计数`
  3. 游戏关卡设计:生成不同结构的技能树`
  4. 密码学:随机二叉树的密钥空间计算`

相似题目#

不同的二叉搜索树
https://website-truelovings-projects.vercel.app/posts/algorithms/不同的二叉搜索树/
作者
欢迎来到StarSky的网站!
发布于
2025-08-18
许可协议
CC BY-NC-SA 4.0