C++ 实现红黑树:深入 STL map 底层原理
1. 红黑树的概念
红黑树本质上是一棵二叉搜索树,每个节点额外增加了一个颜色位(红色或黑色)。通过对路径上节点颜色的约束,它确保没有一条路径比其他路径长两倍,从而维持近似平衡。
1.1 核心规则
- 每个节点非红即黑。
- 根节点必须是黑色。
- 红色节点的子节点必须是黑色(无连续红节点)。
- 任意节点到其所有叶子空节点的路径上,包含相同数量的黑色节点。
注意:教材中常提到的'叶子节点为黑色'指的是外部空节点(NIL),实际编码中通常用 nullptr 表示,理解概念即可。


1.2 为什么最长路径不超过最短路径的 2 倍?
根据规则 4,每条路径的黑色节点数 bh 是固定的。极端情况下,最短路径全为黑色,长度为 bh。而根据规则 2 和 3,红色节点不能相连,所以最长路径是一黑一红交替,长度约为 2 * bh。因此,高度 h 满足 bh <= h <= 2 * bh。
1.3 效率分析
设节点数为 N,则 2^h - 1 <= N <= 2^(2*h) - 1。推导出 h ≈ logN。这意味着增删查改的最坏时间复杂度仍为 O(logN)。相比 AVL 树,红黑树对平衡要求稍宽松,插入时的旋转次数更少,更适合频繁插入的场景。

2. 红黑树的实现
2.1 节点结构
我们需要一个包含颜色、键值对及左右父指针的结构体。为了处理旋转,父指针必不可少。
enum Colour { RED, BLACK };
template<class K, class V>
struct RBTreeNode {
pair<K, V> _kv;
RBTreeNode* _left;
RBTreeNode* _right;
RBTreeNode* _parent;
Colour _col;
( pair<K, V>& kv)
:_kv(kv), _left(), _right(), _parent(), _col(RED) {}
};
< , >
{
RBTreeNode<K, V> Node;
:
:
Node* _root = ;
};





