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 题)
相关推荐
thusloop6 小时前
零门槛接入 GPT-6-astra 与 claude-opus-5-5,三大场景实战指南
python·gpt·算法·agent·claude·codex
瓦瓦gogo6 小时前
学回溯算法时,我先弄明白了怎么“退回来”
算法
Lzg_na6 小时前
堆和堆排序
算法
TK泰妞6 小时前
TikTok 带货视频如何做多语言本地化?从翻译脚本到重做场景的实用方法
算法·音视频
房开民6 小时前
DDPM 完整原理 + 全套公式串联
算法
lunar_coder6 小时前
哈希扩展 -- 位图思想
c++·算法·哈希算法
秋天的怀念_David7 小时前
听故事学语言 · 数据结构篇 · 序章一 算法之问
数据结构·程序人生·算法
海绵宝宝的月光宝盒7 小时前
9-AutoCAD-移动、旋转、复制命令应用与案例实战
经验分享·笔记·职场和发展·课程设计·制造·学习方法·cad
LG.YDX7 小时前
基于中心的3D目标检测和探索追踪-笔记
笔记·算法·目标检测
民乐团扒谱机7 小时前
【读论文】音色在微分音程记忆中的作用
人工智能·深度学习·算法