C++ 红黑树实现详解
红黑树是一种自平衡的二叉搜索树,每个节点增加一个存储位表示颜色(红色或黑色)。通过对路径上节点颜色的约束,确保没有一条路径比其他路径长出两倍,从而实现近似平衡。
一、红黑树的概念
1.1 红黑树的规则
- 每个节点不是红色就是黑色。
- 根节点是黑色的。
- 如果一个节点是红色的,则它的两个子节点必须是黑色的(即任意路径不会有连续的红节点)。
- 对于任意一个节点,从该节点到其所有 NULL 叶节点的简单路径上,均包含相同数量的黑色节点。
说明:《算法导论》等书籍补充了叶子节点(NIL)都是黑色的规则。这里的叶子节点指空节点,为了方便标识路径。实际实现中通常忽略显式的 NIL 节点,只需理解概念即可。
1.2 为什么最长路径不超过最短路径的 2 倍?
- 由规则 4 可知,每条路径的黑色节点数量相同,设为 bh(黑高)。极端情况下,最短路径全是黑节点,长度为 bh。
- 由规则 2 和 3 可知,任意路径无连续红节点,极端情况下最长路径是一黑一红间隔组成,长度为 2*bh。
- 综合来看,假设路径长度为 x,则 bh <= x <= 2*bh。

1.3 红黑树的效率
设 N 为节点数,h 为最短路径长度。由 2^h - 1 <= N < 2^(2*h) - 1 可推出 h ≈ logN。因此增删查改的最坏时间复杂度仍为 O(logN)。
相比 AVL 树,红黑树通过颜色约束间接实现平衡,对平衡控制没那么严格。插入相同数量节点时,红黑树的旋转次数通常更少,性能更优。
二、红黑树的实现
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;
RBTreeNode(const pair<K, V>& kv)
:_kv(kv), _left(nullptr), _right(nullptr), _parent(nullptr) {}
};
template<class , >
{
RBTreeNode<K, V> Node;
:
:
Node* _root;
};



