红黑树的左旋、右旋和颜色翻转是维持平衡的三个基础操作。左旋将右子节点y上移为父节点,x变为y的左子;右旋对称地将左子节点x上移;颜色翻转使节点及其两个红子节点同调变色,三者协同修复红黑性质。

红黑树的左旋、右旋和颜色翻转,是维持其平衡性的三个基础操作。它们不单独存在,而是在插入或删除后,根据节点颜色与结构关系被触发,共同修复被破坏的红黑性质。
左旋:把右子节点“提上来”
左旋围绕一个非空节点 x 进行,将其右子节点 y 上移为新父节点,x 变为其左子节点。整个过程本质是降低 x 的高度、抬高 y 的位置,同时保持二叉搜索树的有序性(中序遍历不变)。
关键步骤(需更新6个指针):
- 令 y = x.right
- 将 y.left 接给 x.right,并修正 y.left 的父指针(若非空)
- 让 y.parent 指向 x.parent;若 x 是根,则 y 成为新根
- 若 x 是其父的左/右孩子,对应把 y 挂到父节点的左/右位置
- 设置 y.left = x,x.parent = y
右旋:把左子节点“提上来”
右旋是左旋的镜像操作,围绕节点 y,将其左子节点 x 上移为新父节点,y 变为其右子节点。逻辑对称,同样保证 BST 性质不被破坏。
核心动作:
- 令 x = y.left
- 将 x.right 接给 y.left,并更新 x.right 的父指针(若非空)
- 设置 x.parent = y.parent;若 y 是根,则 x 成为新根
- 根据 y 在其父节点中的方位,把 x 挂到对应侧
- 设置 x.right = y,y.parent = x
颜色翻转:三节点同调变色
颜色翻转不是单点操作,而是针对一个节点及其两个红色子节点的组合行为。典型场景是:当某个节点 node 的左右子节点均为红色时,说明它可能违反了“红节点不能有红孩子”的规则,此时执行翻转:
- node 由黑变红(若原本是黑)或保持红(但实际中 node 此时多为黑)
- node.left 和 node.right 均由红变黑
注意:颜色翻转本身不改变结构,只调整颜色分布,常配合旋转使用——比如先翻转再旋转,或旋转后再翻转,以逐步恢复全部5条红黑性质。
三者如何协同工作
在插入新节点(默认红色)后,真正起作用的是这三者的组合策略,而非孤立调用:
- 若当前节点右红、左不红 → 先左旋,再处理结构
- 若当前节点左红且左左也红 → 先右旋,提升左子为父
- 若左右都红 → 颜色翻转,把问题上推至祖父节点
- 最终确保根为黑,且无连续红节点、黑高一致
实现时需严格维护 parent 指针(尤其在旋转中),并始终在递归回溯路径上检查和修复。这些操作加起来,让红黑树在均摊意义上保持 O(log n) 的高度。











