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

为什么最长路径不超过最短路径的 2 倍?
根据规则 4,每条路径的黑色节点数(黑高 bh)是固定的。
- 最短路径:全为黑色节点,长度为 bh。
- 最长路径:红黑交替,由于不能有连续红节点,最大长度为 2bh。 因此,树的高度 h 满足 bh ≤ h ≤ 2bh,保证了效率。
效率分析
设节点数为 N,高度为 h。由 2^h - 1 ≤ N ≤ 2^(2*h) - 1 可推导出 h ≈ logN。 这意味着红黑树的增删查改最坏时间复杂度仍为 O(logN)。相比 AVL 树,红黑树对平衡的控制稍宽松,插入时的旋转次数更少,更适合频繁插入的场景。

红黑树的实现细节
节点结构
我们需要在 BST 节点基础上增加父指针和颜色属性,以便回溯调整。
// 颜色枚举
enum Colour { RED, BLACK };
template<class K, class V>
struct RBTreeNode {
pair<K, V> _kv;
RBTreeNode* _left;
RBTreeNode* _right;
RBTreeNode* _parent;
Colour _col;
RBTreeNode( pair<K, V>& kv)
: _kv(kv), _left(), _right(), _parent(), _col(RED) {}
};
< , >
{
RBTreeNode<K, V> Node;
:
:
Node* _root = ;
};





