Red–black tree
红黑树
1. overview
- 红黑树是一种二叉搜索树 点击查看
- 红黑树实现了一种自平衡,可叫做一种平衡二叉查找树,但其并非完全平衡
- 在O(log n)时间内做查找,插入和删除
- 新插入的节点默认都是红色,之后进行插入修复
- 红黑树的平衡实现靠插入与删除节点后根据颜色规则进行的重新修复
红黑树的红黑规则,按照此规则调整数结构即可保持相对平衡
1)每个结点要么是红的,要么是黑的。
2)根结点是黑的。
3)每个叶结点(叶结点即指树尾端NIL指针或NULL结点)是黑的。
4)如果一个结点是红的,那么它的俩个儿子都是黑的。
5)对于任一结点而言,其到叶结点树尾端NIL指针的每一条路径都包含相同数目的黑结点。红黑树的基本操作要点:(查询与插入节点、删除节点与二叉搜索树一致)
- 左旋转
- 右旋转
- 插入后修复
- 删除后修复
2. 旋转

- 详细分解图解析算法步骤,图中线段序号为操作方式顺序,虚线为断开
1)将Y的左孩子b连接到旋转节点X右孩子,线1
2)设置Y左的父亲为X,线2,3
3)Y的父亲设置为X的父亲 线4,5
4)如果X是其父左,将Y设置为其父左,否则设置为右 线4,5
5)设置Y的左为X,X的父为Y x线6
6)结束
|
|
2.2 右旋转
参照左旋转分解同理可写出右旋的代码:
|
|
3. 插入
3.1 节点插入
红黑树的节点插入与二叉搜索树一致,找到位置接入即可,注意其接入的节点都是叶子节点
|
|
3.2 插入后的修复
- 二叉搜索树在节点的插入之后,树的平衡性会遭到破坏,导致查找时间不确定,平均查找时间变坏,红黑树利用节点的颜色规则通过旋转保持了树的相对平衡
插入修复的示意图如下:

在节点插入时,总共有如下几种情况:
- 树空
- 父黑
- 父红,叔红,自己左
- 父红,叔红,自己右
- 父红,叔黑,自己为右
- 父红,叔黑,自己为左
插入的修复算法只要针对以上情况进行处理即可:处理规则如下,设p为新增节点指针:
|
|
- 可以看出,插入调整的大原则就是,哪边的节点多,就往另一边转一下,但并非每次都转(如规则2),确保平衡的同时减少树的调整次数
|
|
3.3 方便调试的代码
|
|
4. 删除
- 删除较为复杂,核心思想点就是,如果删除的是黑色节点,那么删除节点替补节点及其子树少了一个黑节点,想办法补充一个(增加一个,或兄弟节点子树减少一个)
二叉搜索树删除节点p的方法:
- 如果p是叶子只有一个儿子节点,直接将其儿子或nil链接给父
- p有双儿子,从左子树找到最大值节点y,将y.value赋给p.value, y的左子树链接至y.parent,此时y被删除
红黑树节点删除:
- 节点的删除与普通二叉搜索树相同
- 如果删除的是黑节点,可能破坏了规则5,那么需要调整修复颜色
红黑树节点删除调整颜色的CASE如下,x表示删除节点的替换节点,即其左子树或右子树:
请观察图,其本质都是平衡删除节点左右的黑节点数量
4.1 删除节点
两个版本的删除节点方法,第一个更易读一些:
4.2 删除节点后的修复
修复详细代码:


