C++ 红黑树核心原理与完整实现
前言
在掌握了 AVL 树的平衡机制后,我们迎来了更实用且高效的平衡二叉搜索树——红黑树。它是 C++ STL 中 map 和 set 的底层基石。相比 AVL 树严格的平衡要求,红黑树通过颜色约束实现了近似平衡,在插入和删除操作上往往具有更好的性能表现。
1. 红黑树的概念与规则
1.1 什么是红黑树
红黑树是一种自平衡的二叉搜索树。每个节点增加一个存储位表示颜色(红色或黑色)。通过对路径上颜色的约束,确保没有一条路径会比其他路径长出两倍,从而保证整体接近平衡。
1.2 五大性质
- 每个节点要么是红色,要么是黑色。
- 根节点必须是黑色。
- 如果一个节点是红色,则它的两个子节点必须是黑色(即不能有两个连续的红色节点)。
- 从任一节点到其每个叶子的所有简单路径都包含相同数目的黑色节点。
- 所有的叶子节点(NULL)都是黑色的。
注意:这里的'叶子节点'通常指外部空节点,而非传统意义上的终端节点。
1.3 为什么最长路径不超过最短路径的两倍
根据性质 4,每条路径上的黑色节点数量(黑高)是固定的,记为 $bh$。
- 最短路径:全由黑色节点组成,长度为 $bh$。
- 最长路径:红黑交替出现,由于性质 3 限制无连续红节点,长度最多为 $2 \times bh$。 因此,最长路径不会超过最短路径的两倍,时间复杂度稳定在 $O(\log N)$。

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;
RBTreeNode(const pair<K, V>& kv)
:_kv(kv), _left(nullptr), _right(nullptr), _parent(nullptr), _col(RED) {}
};
2.2 查找操作
查找逻辑与普通二叉搜索树一致,效率为 $O(\log N)$。
Node* Find( K& key) {
Node* cur = _root;
(cur) {
(cur->_kv.first > key) cur = cur->_left;
(cur->_kv.first < key) cur = cur->_right;
cur;
}
;
}


