红黑树是 C++ STL 里 map/set 的底层实现,它不追求 AVL 那样严格的平衡,而是靠一套颜色规则和局部旋转来控制树高。最直接的好处是:插入数据时旋转次数少得多,工程上更实用。
五条性质是理解红黑树的基础。简单记就是:
- 每个节点要么红要么黑。
- 根节点必须是黑色。
- 红色节点的两个子节点都得是黑色(不能连续红)。
- 从任一节点到其所有后代 NIL 叶子节点的路径上,黑色节点数量相同。
- NIL 叶子节点都视为黑色。
为什么这样就能保证最长路径不超过最短路径的两倍?假设黑色高度为 bh,最短的情况是全黑路径,长度就是 bh;最长的情况是红黑交替,但规则禁止连续红,所以最多 2 * bh。于是任意路径长度 h 满足 bh ≤ h ≤ 2 * bh,树的深度大致可控。
节点设计与类框架
为了旋转时能方便地索引父节点,每个节点除了左右孩子指针和键值对,还需要 _parent 指针。默认新节点颜色设为红色——因为插入红色可能只破坏'不连续红'这一条规则,调整起来比破坏黑高简单。
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) {}
};
外层用模板类封装,接口只暴露 insert、isBalance 和 Height,内部实现旋转和递归检查。
template <class K, class V>
class RBTree {
public:
bool insert(const std::pair<K, V>& kv);
bool isBalance();
;
:
RBTreeNode<K, V> Node;
Node* _root = ;
_rotateCount = ;
;
;
;
_isBalance(Node* root = );
_Height(Node* root = );
};


