但对于 2 个关键码的节点,可以让其中之一为红另一为黑,若有 n 个 2 关键码节点,则可对应 2n 颗红黑树
! 在三个关键码的超级节点中,黑色节点必须处于中间!
红黑树也是 BBST:
也就是说高度 h=O(logn)
黑高度记为 b,即对应的 B 树高度
从根触发,在抵达任一 NULL 前,会经过恰好 b 个黑节点,以及 r≤b 个红节点,因此 h=b+max{r}−1<2b=O(logn)
常系数约为 2
插入 & 双红
按 BST 规则插入并染红。
若出现双红情况(当前节点和父节点都为红),其祖父必然为黑(插入前必然满足红黑树规则),视祖父的另一个孩子 u 的颜色分别处理,进行双红修复。
双红修复
若 u 为黑,视为 B 树,相当于 x,p,g 超级节点中黑节点不居中,只需旋转后重新染色即可立即完成修复
- 若 u 为红,视为 B 树,相当于 x,p,g,u 超级节点上溢,将 g 上移一层。从红黑树的视角,**不存在旋转**,只需将 g 转红,将 p,u 转黑。染色过程可能向上传递 $O(\log n)$ 次
#### 时间复杂度
重构和染色均只需常数时间,故
- 时间复杂度为 $O(\log n)$
- 至多做 $O(\log n)$ 次染色、1-2 次旋转(双旋则 2 次,单旋则 1 次)
![[Pasted image 20260105132110.png]]
### 删除 & 双黑
先按 BST 规则进行删除,设 p 的孩子 x 被删除,替代者为 r。
- 若 x 为红色,不会影响树的平衡性,直接返回。
- 若 x 为黑色且其子节点 r 为红色,只需令 r 染色为黑色即可。
- 若 x 和 r 均为黑色,进行**双黑修复**
#### 双黑修复
根据 p 和 x 的兄弟 s 和它的孩子的染色情况分别处理,总共 4 种情况:
- s 为黑,且至少有一个红孩子 t,看作 B 树,相当于 x 超级节点下溢,且有一兄弟有多余关键码。
- 若 p 为红,则 p 超级节点中必存在一个黑关键码
- 若 p 为黑,则必自成一个节点,只需令 s 继承 p 的染色,进行旋转,并将 t 和 p 染黑即可,**修复完成**。
- s 为黑,且两个孩子均为黑,p 为红,看作 B 树,相当于 x 超级节点下溢,且兄弟没有多余关键码,将 p 下移与两个孩子合并,祖父节点不会继续下溢,**修复完成**。
- s 为黑,且两个孩子均为黑,p 为黑,看作 B 树,相当于 p 下移,且 p 原本在的超级节点**必然**继续下溢,至多传播 $O(\log n)$ 层
- 此处只有红黑树的**局部性质**得到了恢复
- s 为红(p 和 s 的孩子均为黑),先做一次旋转,s 红转黑,p 黑转红,此时黑高度依然异常,x 的兄弟变成了原 s 的孩子 s',情况转化为了 BB-1 或 BB-2R(因为 p 为红,不会是 BB-2B),再经过一轮调整即可完成修复,且**不会向上传播**