相关笔记

概览

红黑树是一种自平衡二叉搜索树,通过为每个节点附加颜色属性(红或黑)并施加五条结构性约束,保证树高始终为 ,从而确保查找、插入、删除操作均可在 时间内完成。本节介绍红黑树的定义、五条性质、黑高度概念,以及通过引理13.1推论13.2严格证明红黑树的高度上界。


知识结构总览

flowchart TD
    A["二叉搜索树 BST"] --> B["红黑树 Red-Black Tree"]
    B --> C["五条性质"]
    C --> C1["性质1: 节点着红或黑"]
    C --> C2["性质2: 根是黑色"]
    C --> C3["性质3: NIL叶节点是黑色"]
    C --> C4["性质4: 红节点之子皆黑"]
    C --> C5["性质5: 黑高度一致"]
    B --> D["黑高度 bh(x)"]
    D --> E["引理13.1: 内部节点下界"]
    E --> F["推论13.2: 高度上界 h≤2lg(n+1)"]
    F --> G["操作复杂度 O(lg n)"]

核心思想

核心思路

红黑树的核心思想是在二叉搜索树的基础上,引入”颜色”这一额外元数据,通过五条局部约束来控制树的全局平衡性。与AVL树直接限制左右子树高度差不同,红黑树采用更”宽松”的平衡策略:它不要求严格的平衡,而是通过性质4(红节点的两个子节点必须为黑色)和性质5(所有路径黑高度相同)来间接限制树高不超过 。这种”适度平衡”使得插入和删除操作所需的旋转次数被限制在常数次,在实际工程中表现优异。

红黑树的形式化定义

一棵红黑树是一棵满足以下五条性质的二叉搜索树:

  1. 性质1:每个节点要么是红色的,要么是黑色的。
  2. 性质2:根节点是黑色的。
  3. 性质3:每个叶节点(NIL)是黑色的。
  4. 性质4:如果一个节点是红色的,则它的两个子节点都是黑色的。(等价地:不能有两个相邻的红色节点。)
  5. 性质5:对每个节点,从该节点到其后代叶节点的所有简单路径上,均包含相同数目的黑色节点。

黑高度(black-height)

从节点 不包含 本身)出发,到达任意一个叶节点(NIL)的路径上的黑色节点数目,称为节点 黑高度,记作

特别地,NIL节点的黑高度为

引理13.1及其证明

引理13.1

以节点 为根的子树中,内部节点数至少为

【引理13.1(黑高度归纳:内部节点数≥2^bh(x)-1)】

证明: 对黑高度 进行数学归纳法。

循环不变式

归纳假设: 对于黑高度为 的任意节点 ,以其为根的子树至少包含 个内部节点。

基础情况(): 时,节点 的两个子节点都是NIL(因为从 到叶节点的路径上不再有黑色节点)。此时以 为根的子树恰好包含 个内部节点(即 本身)。而 ,所以 成立。

归纳步骤: 假设对于 ,命题成立。考虑 的情况。

维护: 节点 有两个子节点 。由于 本身是黑色(否则 不会计入 ),其子节点的黑高度为 (若子节点为红色则黑高度仍为 ,若为黑色则为 )。由归纳假设,每个子树至少有 个内部节点。因此以 为根的子树的总内部节点数至少为:

终止: 归纳对所有 成立,引理得证。

推论13.2及其证明

推论13.2

一棵含有 个内部节点的红黑树的高度至多为

【推论13.2(红黑树高度上界h≤2lg(n+1))】

证明: 设红黑树的根为 ,树高为

考虑从根 到任意叶节点(NIL)的一条最长路径。由于性质4(红节点的子节点必须为黑色),该路径上红色节点数最多等于黑色节点数(即红黑交替排列时红色最多)。因此路径上至少有一半的节点是黑色的,即:

引理13.1,以 为根的整棵树的内部节点数满足:

代入:

时间复杂度分析

时间复杂度

推论13.2,含 个内部节点的红黑树高度

因此,基于红黑树的查找插入删除操作的时间复杂度均为

其中,插入和删除操作可能需要通过旋转13.2 旋转)和变色来修复被破坏的红黑性质,但旋转次数被限制在常数次 ,因此总体仍为


补充理解与拓展

红黑树的发明历史

红黑树的思想最早源于Rudolf Bayer于1972年提出的”对称二叉B树”(Symmetric binary B-trees)1。Bayer注意到B树的平衡性可以通过在二叉树上引入颜色标记来模拟。1978年,Leonidas J. Guibas和Robert Sedgewick在论文”A dichromatic framework for balanced trees”中2正式引入了红/黑着色方案,建立了红黑树的理论框架,并证明了其与2-3-4树的等价性。

后续发展包括:Arne Andersson于1993年提出的AA树(一种简化版红黑树,仅允许右倾红色链接)3,以及Robert Sedgewick于2008年提出的左倾红黑树(Left-Leaning Red-Black Tree, LLRB)4,进一步简化了实现。

红黑树与2-3-4树的对应关系

红黑树可以看作是2-3-4树(一种4阶B树)的二叉树表示。具体对应关系为:

  • 黑色节点对应2-3-4树中的一个节点;
  • 红色节点与其黑色父节点一起,对应2-3-4树中的一个更大的节点(3-节点或4-节点);
  • 性质4(红节点的子节点皆黑)保证了2-3-4树中不会出现”5-节点”;
  • 性质5(黑高度一致)保证了所有叶节点在同一层,即2-3-4树的所有叶节点深度相同。

这种对应关系是理解红黑树操作(插入、删除)的直觉基础2

红黑树 vs AVL树 vs B树

AVL树(Adelson-Velsky and Landis, 1962)要求左右子树高度差不超过1,因此更严格地平衡,树高 ,查找效率略优于红黑树。但AVL树在插入和删除时可能需要 次旋转,而红黑树仅需 次。

红黑树的树高 ,虽然比AVL树略高,但插入删除的旋转次数更少,在写密集场景下表现更优。这也是为什么许多标准库(如Java的TreeMap、C++的std::map、Linux内核)选择红黑树而非AVL树。

Stewart(2024)的基准测试5表明,在实际工作负载中,红黑树的综合性能通常优于AVL树,尤其是在频繁插入删除的场景下。

B树及其变体(B+树)更适合磁盘存储场景,因为它们减少了I/O次数。


易混淆点与辨析

NIL节点是真正的叶子节点,而非"空指针"

❌ 错误理解:红黑树中的NIL只是空指针的标记,不算真正的节点。

✅ 正确理解:在红黑树的形式化定义中,NIL是真正的叶节点(哨兵节点),它们是黑色的(性质3),并且参与黑高度的计算。所有内部节点的子节点要么是另一个内部节点,要么是NIL。将NIL视为显式节点是理解性质5的关键。

黑高度不包含节点本身

❌ 错误理解: 是从 到叶节点路径上包含 在内的黑色节点数。

✅ 正确理解: 不包含 本身。例如,若 是一个黑色叶节点(其两个子节点都是NIL),则 (因为从 到NIL的路径上没有额外的黑色节点)。这一约定使得归纳证明更加简洁。

性质4不意味着黑节点的子节点必须为红色

❌ 错误理解:如果一个节点是黑色的,则它的子节点至少有一个是红色的。

✅ 正确理解:性质4只规定了”红节点的子节点必须为黑色”(单向约束),对黑色节点的子节点颜色没有任何限制。黑色节点的子节点可以是两个黑色节点,也可以是一个红一个黑。

红黑树不要求严格的平衡

❌ 错误理解:红黑树是完美平衡的,左右子树高度差不超过1。

✅ 正确理解:红黑树只保证高度上界 ,并不要求左右子树高度差有严格限制。最坏情况下,一条路径可能全是黑节点(长度为 ),而另一条路径红黑交替(长度为 ),两者高度差可达


习题精选

题号题目描述难度涉及知识点
13.1-1对给定的红黑树,验证其是否满足全部五条性质★☆☆五条性质的综合应用
13.1-2计算给定红黑树中各节点的黑高度★☆☆黑高度的定义与计算
13.1-3分别构造 个内部节点的红黑树的最大高度和最小高度★★☆高度上界与下界
13.1-4证明非空红黑树中至少有一个红色节点★☆☆性质2与性质4的联合推导
13.1-5求黑高度为 的红黑树的最小内部节点数★★☆引理13.1的等号条件
13.1-6求黑高度为 的红黑树的最大高度★★☆性质4与性质5的联合分析
13.1-7找出一个替代性质5的等价方案★★★红黑树性质的等价表述

视频学习指南

资源讲者/来源时长特点
MIT 6.006 Lecture 10: Red-Black TreesErik Demaine~75min经典课程,从BST到红黑树的动机讲解清晰
红黑树的插入与删除蔡军(青岛大学)~45min中文讲解,配合动画演示,适合入门
Red-Black Trees in 4 minutesMichael Sambol~4min极简动画,快速建立直觉
Left-Leaning Red-Black TreesRobert Sedgewick (Princeton)~60min作者本人讲解LLRB,深入浅出
Red-Black Tree VisualizationUniversity of San Francisco交互式在线可视化工具,可逐步操作观察
CLRS Chapter 13 精读算法导论读书会(B站)~90min中文逐节精读,包含习题讨论

教材原文

CLRS 第4版 13.1节原文

一棵红黑树是一棵满足下列红黑性质的二叉搜索树:

性质1: 每个节点或是红色的,或是黑色的。

性质2: 根节点是黑色的。

性质3: 每个叶节点(NIL)是黑色的。

性质4: 如果一个节点是红色的,则它的两个子节点都是黑色的。

性质5: 对每个节点,从该节点到其后代叶节点的所有简单路径上,均包含相同数目的黑色节点。

为了便于处理红黑树代码中的边界条件,我们使用一个哨兵来代表NIL。对于一棵红黑树 ,哨兵 是一个与普通节点具有相同属性的对象,它的颜色为黑色,而它的其他属性()的值可以设为任意值。我们将所有指向NIL的指针替换为指向哨兵 的指针。

我们将节点 黑高度(black-height)记为 ,它是指从节点 出发(但不包含 )到达一个叶节点的任意路径上的黑色节点数。根据性质5,该定义是良定义的。


参见Wiki

第13章-红黑树 红黑树的性质

Footnotes

  1. Bayer, R. (1972). “Symmetric binary B-Trees: Data structure and maintenance algorithms.” Acta Informatica, 1(4), 290–306.

  2. Guibas, L. J., & Sedgewick, R. (1978). “A dichromatic framework for balanced trees.” Proceedings of the 19th Annual Symposium on Foundations of Computer Science (FOCS), 8–21. 2

  3. Andersson, A. (1993). “Balanced search trees made simple.” Proceedings of the 3rd Workshop on Algorithms and Data Structures (WADS), LNCS 709, 60–71.

  4. Sedgewick, R. (2008). “Left-Leaning Red-Black Trees.” Data Structures Seminar at Dagstuhl, Feb 2008.

  5. Stewart, J. W. (2024). “Comparative Performance of the AVL Tree to Three Variants of the Red-Black Tree.” Software: Practice and Experience, 54(7), 1–22.