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 题)
相关推荐
wdfk_prog2 小时前
嵌入式面试真题第 10 题:高优化等级下共享状态可见性、内存模型与系统级同步设计
java·linux·开发语言·面试·职场和发展·架构·c
wdfk_prog3 小时前
嵌入式面试真题第 11 题:RTOS 优先级翻转与实时任务阻塞的通用治理
c语言·缓存·面试·职场和发展·架构
QXWZ_IA6 小时前
1库1图1批是什么?千寻位置公安地图数据体系详解
科技·算法·能源·媒体·交通物流·政务
c238567 小时前
Bug 猎手入门指南
c++·算法·bug
Reart7 小时前
Leetcode 213.打家劫舍2(内含闲谈,打劫真是技术活,好题,716)
后端·算法
Reart8 小时前
Leetcode 198.打家劫舍(716)
后端·算法
Jerry8 小时前
LeetCode 110. 平衡二叉树
算法
玖玥拾8 小时前
C++ 数据结构 八大基础排序算法专题
数据结构·c++·算法·排序算法
Tim_109 小时前
【C++】017、new/delete与malloc/free的区别
java·数据结构·算法