
坎坷之路,终抵星空。
—— 哈珀·李《杀死一只反舌鸟》
1. 解密红黑树:平衡与效率的双重奏
探讨红黑树如何通过一组简单的规则保持平衡,并提供高效的查询和更新操作。
红黑树是一种特殊的二叉树,它遵循一套独特的规则:
每个节点要么是红色,要么是黑色。根节点必须是黑色的。如果一个节点是红色的,则它的两个子节点必须是黑色的。对于任意一个节点,从该节点到其所有后代叶子节点的简单路径上,必须包含相同数目的黑色节点。每个叶子节点都是黑色的。这里的叶子节点指的是为空的节点。
TIP:红黑树的规则并不要求红黑节点严格交替出现。黑色节点可以连续,但红色节点不能连续。这是规则的设定。

通过这些规则,红黑树可以保持接近平衡的状态。虽然它不像 AVL 树那样可以维持严格的平衡状态,但是它可以保证搜索的效率。需要记住的是:红黑树每条路径(从根节点到空节点)上的黑色节点数量相同。
那么问题来了,红黑树如何确保最长路径不超过最短路径的 2 倍的?
由规则 4 可知,从根到 NULL 结点的每条路径都有相同数量的黑色结点,所以极端场景下,最短路径就是全是黑色结点的路径,假设最短路径长度为 bh(black height)。由规则 2 和规则 3 可知,任意一条路径不会有连续的红色结点,所以极端场景下,最长的路径就是一黑一红间隔组成,那么最长路径的长度为 2bh。综合红黑树的规则而言,理论上的全黑最短路径和一黑一红的最长路径并不是在每棵红黑树都存在的。假设任意一条从根到 NULL 结点路径的长度为 x,那么 bh <= x <= 2bh。
这样红黑树保证了查找效率!!!
假设 N 是红黑树树中节点数量,h 为最短路径长度,那么等比数列求和有 2^(h) -1<=N<=2^(2h) -1 因此可以知道 h 近似为 log N,也就是意味着红黑树增删查改最坏也就是走最长路径 2*logN,那么时间复杂度还是 O(log N)
红黑树的表达相对 AVL 树要抽象一些,AVL 树通过高度差直观的控制了平衡。红黑树通过规则的颜色控制,间接的实现了近似平衡,他们效率都是同一档次,但是相对而言,插入相同数量的结点,红黑树的旋转次数是更少的,因为他对平衡的控制没那么严格。

红黑树的应用场景十分广泛,其中之一是在很多高性能的 C++ STL 库中被广泛采用,比如 map 和 set。这是因为红黑树具有平衡性能较好的特性,能够保持树的高度较低,从而保证了在插入、删除和查找操作上的较高效率。除此之外,它还常用于实现范围查询和有序遍历等功能。后续将实现 map 与 set 的封装。
红黑树的平衡性质使其在数据库系统中也得到了广泛的应用,特别是在实现索引结构时。在数据库系统中,红黑树可以用于实现基于范围的查询,如在 B+ 树的实现中,通常使用红黑树来维护叶子节点的有序性。
2. 搭建红黑树:从零到自平衡的实现之路
2.1 树基打底:设计与框架构建
红黑树的基本设计思想,构建红黑树所需的基本元素和数据结构。
红黑树的节点设计基于二叉搜索树的节点增加了一个表示颜色的变量,用来标识该节点的颜色,我们采用枚举表示颜色状态








