红黑树删除后修正需严格处理双黑缺陷传播的六种情形:先定位双黑节点x及其兄弟w,情形一将红兄弟转黑并旋转;情形二w两子均黑则w染红、p染黑或x上移;情形三、四通过近侄染色+旋转转为情形五;情形五远侄为红时,w染p色、p染黑、远侄染黑并单旋,终结修正。

实现红黑树节点删除后的平滑平衡修正,必须严格处理删除导致的双黑缺陷在路径上传播时引发的六种结构情形,每种情形对应唯一的旋转+ recolor 组合,稍有错位就会破坏红黑性质。
前置:定位双黑缺陷与兄弟节点
从被删节点的替代子(null 或实际子节点)开始向上回溯,找到第一个【双黑节点】——即该位置逻辑上应存在一个黑色节点但实际为空或为红色,导致父路径黑高失衡;将其记为 x,其父节点为 p,兄弟节点为 w(w 必不为空,否则父节点无法满足黑高一致)。
这一步不可跳过:若未确认 x 是真正双黑起点,后续所有情形判断都将失效。
情形一:兄弟 w 为红色
方法一:先变色再转父节点
将 w 染黑 → 将 p 染红 → 以 p 为轴右旋(若 x 是 p 的左孩子)或左旋(若 x 是 p 的右孩子)→ 旋转后 w 成为新父节点,其原左右孩子成为 p 的新兄弟分支。
此时 w 必变为黑色,且其靠近 x 一侧的孩子必为黑色(因原 w 红色,其子只能是黑),于是自动转入情形二至情形五中的一种;这步本质是把红兄弟“压下去”变成黑兄弟,为后续标准情形铺路。
情形二:兄弟 w 为黑色,且 w 的两个孩子均为黑色
第一步:直接染色提升黑高
将 w 染红 → 若 p 原为红色,则将 p 染黑,结束修正;
若 p 原为黑色,则 x 向上移动至 p 位置,继续以新 x 进行情形判断——此时原 p 成为新的双黑节点,缺陷上移。
注意:w 的两个孩子是否为 NIL 不影响判断,只要它们不是红色即可;NIL 节点视为黑色,所以 w 的孩子全黑是常见初始态。
情形三与情形四:兄弟 w 黑,远侄非红而近侄红
方法一(x 为左孩子,w 右孩子黑、左孩子红):
将 w 的左孩子染黑 → 将 w 染红 → 以 w 为轴右旋 → 此时 w 的原左孩子成为新兄弟,且其右孩子必为红色(由红黑树插入性质约束),自动转为情形四。
方法二(x 为右孩子,w 左孩子黑、右孩子红):
将 w 的右孩子染黑 → 将 w 染红 → 以 w 为轴左旋 → 同样导出情形四结构。
这一步的关键是:必须先处理近侄,否则旋转后颜色错位无法恢复黑高。
情形五:兄弟 w 黑,远侄为红色(标准终结情形)
将 w 染成 p 的原颜色 → 将 p 染黑 → 将 w 的远侧孩子染黑 → 以 p 为轴执行单旋(左旋当 x 为左孩子,右旋当 x 为右孩子)→ 旋转后整条路径黑高恢复,双黑消除,修正结束。
这一步操作后无需再向上检查:旋转+染色已一次性补足缺失的黑色,且不引入新的双黑。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











