首页/数据结构/04-tree/二叉树的计数问题 🔗 在 Obsidian 中打开
数据结构 · 树与二叉树

二叉树的计数问题

难度 ★★重要度 ★★ 考查频率 低 二叉树计数卡特兰数
速查
具有 $n$ 个不同结点的二叉树共有 $C_n = \frac{1}{n+1}\binom{2n}{n}$ 棵(第 $n$ 个卡特兰数)。前几项:1, 1, 2, 5, 14, 42, 132, 429 …

核心概念

二叉树的计数问题:给定 $n$ 个互不相同的结点,问能构成多少棵结构不同的二叉树(结点值视为可区分,只关心形状;若结点值固定,则每棵形状对应一种标号方式)。

答案是著名的卡特兰数(Catalan number)

$$C_n = \frac{1}{n+1}\binom{2n}{n} = \frac{(2n)!}{(n+1)!\,n!}$$
直观理解根占 1 个结点,左子树 $i$ 个、右子树 $n-1-i$ 个组合相乘,对所有 $i$ 求和即得递推。

公式与递推

设 $b_n$ 为 $n$ 个结点的二叉树数量,则满足递推:

$$b_n = \sum_{i=0}^{n-1} b_i\,b_{n-1-i},\quad b_0 = 1$$

该递推的解正是卡特兰数:$b_n = C_n$。

闭合形式推导

从递推出发可推得 $C_n = \frac{1}{n+1}\binom{2n}{n}$,也可用生成函数法证明。

# 递推计算前 n 项卡特兰数
C = [0]*(n+1); C[0] = 1
for i in range(1, n+1):
    for k in range(i):
        C[i] += C[k] * C[i-1-k]
# C[i] 即 i 个结点的二叉树数量

前几项

$n$01234567
$C_n$11251442132429

n = 3 的枚举

3 个结点共有 $C_3 = 5$ 棵不同形状的二叉树,如下图所示:

图:3 个结点的 5 棵不同形状二叉树(共 C₃ = 5 棵)。

常见考法

题型① 直接求 $n$ 个结点的二叉树数量(背卡特兰数前几项 + 公式);② 用递推 $b_n=\sum b_i b_{n-1-i}$ 手算;③ 与出栈序列数、括号匹配数等卡特兰数应用联系。

易错点

必记
  1. 卡特兰数的分母是 $n+1$,不是 $n$。
  2. $C_n$ 计的是结构不同的二叉树;若结点值互异且固定,则总数为 $n!\,C_n$(每形状可标号)。
  3. 别与“满二叉树数量”“完全二叉树数量”混淆,它们远少于卡特兰数。

核心结论

$n$ 个结点的二叉树数量 = 第 $n$ 个卡特兰数:

$$C_n = \frac{1}{n+1}\binom{2n}{n}$$

递推:$C_0=1,\ C_n=\sum_{i=0}^{n-1} C_i C_{n-1-i}$。前几项 1,1,2,5,14,42,132,429。

记忆卡片

n 个结点的二叉树有多少棵?
第 n 个卡特兰数 Cₙ = 1/(n+1)·C(2n,n)。
C₃ 等于多少?
5 棵。
递推式怎么写?
Cₙ = Σ Cᵢ·Cₙ₋₁₋ᵢ(i 从 0 到 n−1)。
公式分母是?
n+1。

交互动画 · 卡特兰数递推逐步求值

递推公式:C₀ = 1,Cₙ = C₀·Cₙ₋₁ + C₁·Cₙ₋₂ + … + Cₙ₋₁·C₀ C₄ i=0 · C₀·C₃ i=1 · C₁·C₂ i=2 · C₂·C₁ i=3 · C₃·C₀ 0 C₀=1 C₁=1 C₂=2 C₃=5 C₄=14
点击「播放」或「下一步」,从 C₀ 开始逐步递推求出 C₄ = 14

相关知识点

(暂无关联知识点)