C++ 实现红黑树与 STL map 底层原理
1. 红黑树的概念
红黑树是一种二叉搜索树,每个结点增加一个颜色位(红色或黑色)。通过对路径颜色的约束,确保没有一条路径比其他路径长两倍,从而实现近似平衡。
1.1 红黑树的规则
- 每个结点不是红色就是黑色。
- 根结点是黑色的。
- 红色结点的两个孩子必须是黑色(无连续红结点)。
- 任意结点到其 NULL 叶子的简单路径上,包含相同数量的黑色结点。
注:《算法导论》中提到的叶子结点(NIL)均为黑色,实际实现中通常忽略 NIL 结点,理解概念即可。
1.2 为什么最长路径不超过最短路径的 2 倍?
根据规则 4,每条路径的黑色结点数量固定,设为 bh。最短路径全为黑色,长度为 bh。根据规则 2 和 3,最长路径是一黑一红交替,长度为 2 * bh。因此,树的高度 h 满足 bh <= h <= 2 * bh。
1.3 红黑树的效率
设 N 为结点数,h 为高度。由上述推导可知 h ≈ logN。增删查改的最坏时间复杂度为 O(logN)。相比 AVL 树,红黑树对平衡控制稍宽松,插入时的旋转次数更少,更适合频繁插入的场景。
2. 红黑树的实现
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 K, class V>
class RBTree {
typedef RBTreeNode<K, V> Node;
public:
// ...
private:
Node* _root = ;
};


