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 题)
相关推荐
To_OC2 小时前
LC 35 搜索插入位置:二分查找谁都会,边界条件谁写谁懵
javascript·算法·leetcode
天才测试猿2 小时前
2026软件测试面试八股文(含答案+文档)
自动化测试·软件测试·python·功能测试·测试工具·面试·职场和发展
码哥DFS3 小时前
二叉树的直径
开发语言·javascript·算法
营养充电站5 小时前
KMP全栈开发:从Android到AI Agent的技术演进与实践
人工智能·算法·docker·jupyter
技术小黑6 小时前
RNN算法实战系列05 | 天气预测
人工智能·rnn·算法
Ivanqhz8 小时前
php8 use-def链
算法·php
spter。9 小时前
AI 面试相同请求为什么会重复调用,如何解决
人工智能·面试·职场和发展
evans在进步9 小时前
LeetCode 189 轮转数组:三次反转原地解决,图解 Java 实现
java·算法·leetcode
歌_顿9 小时前
Drawing_To_Model
算法