C++ 红黑树详解
1. 什么是红黑树
概念与定义
红黑树是一种自平衡二叉搜索树,由德国计算机科学家 Rudolf Bayer 在 1972 年发明。它通过为每个结点增加一个存储位来表示结点的颜色(红色或黑色),并对从根节点到任意叶子节点路径上的节点颜色进行约束,从而保持树的左右两边的相对平衡。
红黑树确保没有一条路径会比其他路径长出 2 倍,即 2 * 最短路径 >= 最长路径,因而它是一种近似平衡的二叉搜索树。它在很多编程语言的库和实际应用场景中都有广泛使用,例如 C++ 的 STL 库中的 map 和 set 底层实现,Java 的 TreeMap 等库的实现。
红黑树示例
![图片:红黑树示例]
2. 红黑树的性质
- 每个结点不是红色就是黑色。
- 根节点是黑色的。
- 如果一个节点是红色的,则它的两个孩子结点必须是黑色的。
- 对于每个结点,从该结点到其所有后代叶结点的简单路径上,均包含相同数目的黑色结点。
- 每个叶子结点都是黑色的 (此处的叶子结点指的是空结点)。
性质解读
- 左根右:由于它是二叉搜索树,所以左子树的值 < 根的值 < 右子树的值。
- 根叶黑:根节点和叶子节点 (NIL) 都是黑色的。
- 不红红:一条路径上不会出现两个连续的红色节点。
- 黑路同:任意两条路径上的黑色节点个数相同。
因此,红黑树的性质可以简记为:左根右,根叶黑,不红红,黑路同。
树的路径再认识
计算路径是从根节点到空结点 (NIL)。如果树路径的计算不包含空节点,可能会导致误判违反性质 4。
![图片:树路径计算]
3. 红黑树如何确保最长路径不超过最短路径的 2 倍?
- 最短路径(全黑路径):极端场景下,最短路径就是全由黑色结点组成的路径。记为
bh(black height)。 - 最长路径(黑红间隔路径):结合规则 2 和规则 3,极端场景下,最长路径会呈现一黑一红交替的结构,长度为
2*bh。 - 路径长度范围:任意从根到 NIL 结点的路径长度 h,都满足 bh ≤ h ≤ 2*bh,这保证了红黑树的近似平衡特性。
4. 红黑树的实现
整体架构设计
结点颜色的枚举类
enum Colour { Red, Black };
红黑树的结点定义
template<class K, class V>
struct RBTreeNode {
RBTreeNode<K, V>* _left;
RBTreeNode<K, V>* _right;
RBTreeNode<K, V>* _parent;
std::pair<K, V> _kv;
Colour _col;
RBTreeNode(const std::pair<K, V>& kv)
: _left(), _right(), _parent(), _kv(kv), _col(Red) {}
};


