C++ 红黑树实现详解
一、红黑树的概念
红黑树是二叉搜索树的一种变体,每个节点增加一个颜色位(红或黑)。通过对从根到叶子路径上节点颜色的约束,确保没有一条路径比其他路径长出 2 倍,从而保持近似平衡。
1.1 红黑树的规则
- 每个节点不是红色就是黑色。
- 根节点是黑色的。
- 如果一个节点是红色的,则它的两个子节点必须是黑色的(即任意路径无连续红色节点)。
- 对于任意一个节点,从该节点到其所有 NULL 节点的简单路径上,均包含相同数量的黑色节点。
说明:《算法导论》等书籍补充了叶子节点(NIL)都是黑色的规则。这里的叶子节点指空节点,为了便于标识路径。实际实现中通常忽略 NIL 节点的具体存在,只需理解概念即可。
1.2 为什么最长路径不超过最短路径的 2 倍?
- 最短路径:全是黑色节点,长度为黑高 bh。
- 最长路径:一黑一红间隔组成,长度为 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), _col(RED) {}
};
template<class K, class V>
class RBTree {
typedef RBTreeNode<K, V> Node;
public:
// ... 具体方法见完整代码
private:
Node* _root = ;
};


