C++ 红黑树原理与实现详解
1. 什么是红黑树
红黑树(Red-Black Tree)是一种自平衡二叉搜索树。它通过为每个结点增加一个颜色属性(红色或黑色),并对节点间的颜色分布施加约束,使得树在近似平衡的状态下仍能保持高效的查找、插入与删除性能。
虽然 AVL 树追求严格平衡,但在频繁插入和删除时,频繁的旋转会带来较大的性能损耗。红黑树则不追求绝对平衡,而是通过「颜色规则 + 局部旋转」实现动态平衡。这也是 C++ STL 容器 map / set 的底层核心机制。
核心性质
要理解红黑树,必须掌握以下五条性质:
- 结点颜色:每个结点不是红色就是黑色。
- 根节点:根节点是黑色的。
- 红色限制:如果一个节点是红色的,则它的两个孩子结点必须是黑色的(即没有连续的红色结点)。
- 黑高一致:对于每个结点,从该结点到其所有后代叶结点(NIL)的简单路径上,均包含相同数目的黑色结点。
- 叶子结点:每个叶子结点(NIL 结点)都是黑色的。
记忆口诀:左根右(BST 性质)、根叶黑(根和 NIL 为黑)、不红红(无连续红)、黑路同(任意路径黑节点数相同)。
为什么最长路径不超过最短路径的 2 倍?
- 最短路径:全由黑色结点组成。假设黑色高度为
bh,则路径长度为bh。 - 最长路径:黑红交替。由于不能有连续红结点,极端情况下路径长度为
2 * bh。 - 结论:任意路径长度
h满足bh ≤ h ≤ 2 * bh,保证了树的近似平衡性。
2. 整体架构设计
结点定义
红黑树结点需要存储键值对、左右孩子指针以及父指针(为了旋转操作方便)。默认新插入的结点颜色为红色。
enum Colour { Red, Black };
template <class K, class V>
struct RBTreeNode {
RBTreeNode<K, V>* _left;
RBTreeNode<K, V>* _right;
RBTreeNode<K, V>* _parent;
std::pair<K, V> _kv;
Colour _col;
RBTreeNode(const std::pair<K, V>& kv)
: _left(nullptr), _right(nullptr), _parent(nullptr), _kv(kv), _col(Red) {}
};
类结构
使用模板类封装,内部维护根节点指针。
template <class , >
{
:
;
;
;
:
RBTreeNode<K, V> Node;
Node* _root = ;
_rotateCount = ;
;
;
;
_isBalance(Node* root = );
_Height(Node* root = );
};


