C++ 红黑树设计与实现详解
红黑树(Red-Black Tree)是平衡二叉搜索树的一种,它通过颜色约束来保证树的相对平衡。作为 C++ STL 中 map 和 set 的底层数据结构,理解其原理对掌握高级算法至关重要。
1. 红黑树的概念与规则
1.1 什么是红黑树
红黑树是一种二叉搜索树,每个节点增加一个存储位表示颜色(红色或黑色)。通过对根到叶子路径上节点颜色的约束,确保没有一条路径会比其他路径长出两倍,从而实现近似平衡。
1.2 核心规则
红黑树必须满足以下五条性质:
- 每个节点不是红色就是黑色。
- 根节点必须是黑色。
- 如果一个节点是红色,则它的两个子节点必须是黑色(即不存在连续红色节点)。
- 从任一节点到其所有 NULL 叶节点的简单路径上,均包含相同数目的黑色节点(称为黑高)。
- 所有的叶子节点(NULL)都是黑色的。
注意:这里的叶子节点通常指外部空节点,而非传统意义上的终端节点。

1.3 为什么最长路径不超过最短路径的两倍
根据规则 4,每条路径上的黑色节点数量(黑高 bh)是固定的。最短路径显然全是黑色节点,长度为 bh。而最长路径则是红黑交替出现,由于不能有两个连续红节点,最长路径长度最多为 2bh。因此,红黑树的高度 h 满足 bh ≤ h ≤ 2bh,保证了效率接近 O(log N)。
1.4 效率分析
假设节点数为 N,高度为 h,则有 2^h - 1 ≤ N < 2^(2h) - 1。由此可推导出 h ≈ log₂N。虽然红黑树比 AVL 树更'松散',插入时旋转次数更少,但查询效率同样稳定在 O(log N)。
2. 红黑树的实现
2.1 节点结构
红黑树通常采用三叉链表结构,除了左右孩子指针外,还需要父指针以方便回溯调整。颜色枚举默认新节点为红色。
enum Colour { RED, BLACK };
template<class K, class V>
struct RBTreeNode {
pair<K, V> _kv;
RBTreeNode<K, V>* _left;
RBTreeNode<K, V>* _right;
RBTreeNode<K, V>* _parent;
Colour _col;
( pair<K, V>& kv)
:_kv(kv), _left(), _right(), _parent(), _col(RED) {}
};


