红黑树详解
什么是红黑树
红黑树本质上是一棵带有颜色属性的二叉搜索树。每个节点增加一个存储位表示颜色(红色或黑色),通过对路径上颜色的约束,保证最长路径不超过最短路径的两倍,从而实现近似平衡。

核心规则
要维持红黑树的性质,必须遵守以下五条规则:
- 节点颜色:每个节点要么是红色,要么是黑色。
- 根节点:根节点必须是黑色。
- 无连续红节点:如果一个节点是红色,则它的两个子节点必须是黑色(即任意路径不能有连续的红色节点)。
- 黑高一致:对于任意节点,从该节点到其所有叶子节点(NULL 节点)的简单路径上,包含相同数量的黑色节点。
- NIL 节点:所有的叶子节点(NULL)被视为黑色。
注意:规则 4 和 5 保证了树的平衡性。最长路径(红黑交替)不会超过最短路径(全黑)的两倍。
效率分析
由于上述约束,红黑树的高度被严格限制在 $O(\log N)$ 级别。无论是查找、插入还是删除操作,时间复杂度均为 $O(\log N)$,这使其成为实现关联容器(如 std::map、std::set)的理想选择。
插入实现逻辑
插入新节点时,我们默认将其设为红色(避免破坏黑高规则)。如果插入后违反了'无连续红节点'的规则,则需要通过变色和旋转来修复。
情况一:叔叔节点为红色(变色)
当当前节点 cur 的父亲 parent 是红色,且叔叔节点 uncle 也是红色时:
- 将
parent和uncle变为黑色。 - 将祖父节点
grandfather变为红色。 - 此时
grandfather可能违反规则,需将grandfather视为新的当前节点继续向上调整。 - 特点:只变色,不旋转。
情况二 & 三:叔叔节点为黑色(旋转 + 变色)
当 parent 为红色,但 uncle 不存在或为黑色时,说明发生了偏斜,需要通过旋转来调整结构。
-
单旋(左左 / 右右)
- 若
cur是parent的左孩子,且parent是grandfather的左孩子(左左),对grandfather进行右旋。 - 若
cur是parent的右孩子,且parent是grandfather的右孩子(右右),对grandfather进行左旋。 - 旋转后交换
parent和grandfather的颜色。
- 若


