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_OC6 小时前
从一次栈溢出报错说起,我把递归彻底扒明白了
javascript·算法·程序员
千纸鹤安安11 小时前
千问Qwen-AgentWorld来了:一个语言模型搞定七大Agent场景,GPT-5.4都输了
算法
七牛开发者14 小时前
MCP 到底是什么?为什么 Agent 都想接上它
算法·aigc·agent
kisshyshy20 小时前
从递归到迭代,一文吃透二叉树的核心知识与 JavaScript 实现
javascript·算法·代码规范
To_OC1 天前
LC 49 字母异位词分组:想到哈希表很简单,选对 key 才是精髓
javascript·算法·leetcode
用户938515635071 天前
从 O(n²) 到 O(nlogn):一文读懂快速排序的“快”与“妙”
javascript·算法
To_OC2 天前
手写快排次次翻车?别死背快排模板了,这才是面试官想听的底层逻辑
javascript·算法·排序算法
饼干哥哥2 天前
Reddit VOC调研太慢?搭一个AI专家团队半小时洞察任何品类|以猫用饮水机为例
人工智能·算法·ai编程