LeetCode 96:不同的二叉搜索树(Unique Binary Search Trees)—— 题解 ✅

🔗 题目链接

👉 https://leetcode.cn/problems/unique-binary-search-trees/


📖 内容概要

给定一个整数 n,求由 1 ~ n 组成的 互不相同的二叉搜索树(BST) 的总数。

✅ 动态规划

✅ 卡特兰数(Catalan Number)

✅ 面试高频题


💡 解题思路(核心)

一、关键观察

  • BST 的性质:
    • 左子树所有节点 < 根
    • 右子树所有节点 > 根
  • 对于任意根节点 k
    • 左子树由 [1 ... k-1] 组成
    • 右子树由 [k+1 ... n] 组成

二、状态定义

java 复制代码
dp[i] = 由 i 个节点组成的 BST 数量

三、状态转移方程(最重要)

j 为根节点(1 ≤ j ≤ i):

复制代码
左子树节点数 = j - 1
右子树节点数 = i - j
java 复制代码
dp[i] += dp[j - 1] * dp[i - j];

✅ 左右子树的组合数 = 乘积

✅ 对所有可能的根求和


四、初始条件

java 复制代码
dp[0] = 1;

空树也算一种 BST(这是数学上的约定)


✅ AC 代码(Java)

java 复制代码
class Solution {
    public int numTrees(int n) {
        int[] dp = new int[n + 1];
        dp[0] = 1; // 空树

        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= i; j++) {
                dp[i] += dp[j - 1] * dp[i - j];
            }
        }
        return dp[n];
    }
}

⏱️ 复杂度分析

指标 复杂度
时间复杂度 O(n²)
空间复杂度 O(n)

🔢 示例说明

n 结果 说明
1 1 只有一棵树
2 2 1 为根 / 2 为根
3 5 经典 Catalan 数

🧠 数学背景(加分点)

本题的结果正是 卡特兰数(Catalan Number)

Cn=1n+1(2nn)C_n = \frac{1}{n+1}\binom{2n}{n}Cn=n+11(n2n)

前几项:

复制代码
1, 1, 2, 5, 14, 42, 132, ...

✅ 一句话总结

以每个节点为根,左右子树的数量相乘,再累加,就是经典的卡特兰数问题。


📌 面试加分点(建议记住)

  • ✅ 为什么 dp[0] = 1
  • ✅ 为什么是乘法而不是加法
  • ✅ 和卡特兰数的关系
  • ✅ 可扩展到「输出所有 BST」(95 题)
相关推荐
v_34836087622 小时前
Android native端 堆栈打印
android·算法
residual_fan2 小时前
【学术论文】航空发动机故障诊断智能体:基于持续对比强化学习的动态优化方法
人工智能·算法·数据挖掘·数据分析
GreenTea2 小时前
OpenAI Agents API 上手实测:一次调用把整个 agent loop 甩给 OpenAI
前端·后端·算法
深圳满意度咨询3 小时前
医院满意度数字化测评系统:从数据采集到智能决策的技术实践
算法
xiangyun614 小时前
【408数据结构 08】队列:循环队列判空判满,408年年考,一次讲清
c语言·开发语言·数据结构·c++·算法
xiangyun614 小时前
【408数据结构 06】双链表、循环链表、静态链表
c语言·开发语言·数据结构·c++·算法
June bug6 小时前
【HCIA- AI(正课)】3.1.人工智能业务流程
职场和发展
302wanger6 小时前
推荐下我的两个AI信息源
算法
索尔~古德曼6 小时前
CF——错题的集合
算法
SL_staff6 小时前
JVS-Logic:从页面配置工具到企业级业务逻辑中枢的技术演进
java·算法·全栈