C++ 红黑树核心原理与实战实现
红黑树(Red-Black Tree)是平衡二叉搜索树的一种,广泛应用于 std::map、std::set 等 STL 容器底层。相比 AVL 树,它在保持近似平衡的同时,减少了旋转次数,插入删除性能更优。
1. 红黑树的概念与规则
1.1 什么是红黑树
红黑树是一种二叉搜索树,每个节点增加了一个颜色属性(红色或黑色)。通过对路径上节点颜色的约束,确保没有一条路径比其他路径长两倍,从而实现近似平衡。
1.2 五大性质
- 每个节点要么是红色,要么是黑色。
- 根节点必须是黑色。
- 如果一个节点是红色,则它的两个子节点必须是黑色(即不能有两个连续的红色节点)。
- 对任意节点,从该节点到其所有叶子节点(NULL)的简单路径上,包含相同数目的黑色节点。
- 所有的叶子节点(NULL)都是黑色的。
注:这里的叶子节点通常指外部空节点,用于辅助判断路径长度。

1.3 为什么最长路径不超过最短路径的两倍
根据性质 4,每条路径的黑色节点数量(记为 bh)是固定的。最短路径全是黑色节点,长度为 bh。由于性质 3 限制了红色节点不能连续,最长路径由红黑交替组成,长度约为 2bh。因此,红黑树的高度 h 满足 bh <= h <= 2bh,保证了 O(logN) 的时间复杂度。

2. 红黑树的实现结构
红黑树节点需要存储 Key、Value、颜色以及父指针(便于回溯调整),是一个三叉链表结构。
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.1 查找操作
查找逻辑与普通二叉搜索树一致,时间复杂度 O(logN)。
{
Node* cur = _root;
(cur) {
(cur->_kv.first > key) cur = cur->_left;
(cur->_kv.first < key) cur = cur->_right;
cur;
}
;
}


