目录
- 序言
- 红黑树必须满足以下5条性质
- 添加
- 删除
一 序言
红黑树也是一种自平衡的二叉搜索树,以前也叫做平衡二叉B树(Symmetric Binary B-tree)
二 红黑树必须满足以下5条性质
1.节点是RED或者是BLACK
- 根节点是
BLACK -
叶子节点(外部节点,空节点)都是BLACK -
RED节点的子节点都是BLACK
4.1RED节点的parent都是BLACK
4.2 从根节点到叶子节点的所有路径上不能有2个连续的RED节点 - 从任一节点到
叶子节点的所有路径都包含相同数目的BLACK节点

2.1 请问下面这棵是红黑树吗?

红黑树必须满足以下5条性质
- 节点是
RED或者BLACK - 根节点是
BLACK -
叶子节点(外部节点,空节点)都是BLACK -
RED节点的子节点都是BLACK
4.1RED节点的子节点都是BLACK
4.2 从根节点到叶子节点的所有路径上不能有2个连续的RED节点 - 从任一节点到
叶子节点的所有路径都包含相同数目的BLACK节点
2.2 红黑树的等价交换
- 红黑树和4阶B树(2-3-4树)具有等价性
-
BLACK节点与它的RED子节点融合在一起,形成1个B树节点 - 红黑树的
BLACK节点个数 与 4阶B树的节点总个数 相等 - 网上有些教程:用 2-3树 与 红黑树 进行类比,这是极其不严谨的,2-3树 并不能完美匹配 红黑树 的所有情况
- 注意:因为PPT界面空间有限,后面展示的红黑树都会省略NULL 节点
红黑树

等价交换后的4阶B树

2.3 几个英文单词
-
parent:父节点 -
sibling:兄弟节点 -
uncle:叔父节点( parent 的兄弟节点) -
grand:祖父节点( parent 的父节点)
三 添加
已知
- B树中,新元素必定是添加到叶子节点中
- 4阶B树所有节点的元素个数
x都符合1 ≤ x ≤ 3 - 如果添加的是根节点,染成BLACK 即可

3.1 添加的所有情况
- 有 4 种情况满足红黑树的性质 4 :
parent为BLACK
1.同样也满足 4阶B树 的性质
2.因此不用做任何额外处理

- 有 8 种情况不满足红黑树的性质 4 :
parent为RED( Double Red )
- 其中前 4 种属于B树节点上溢的情况

3.2 修复 - 修复性质4 - LL\RR
判定条件:uncle 不是RED
-
parent染成BLACK,grand染成RED -
grand进行单旋操作
2.1 LL:右旋转
2.2 RR:左旋转

3.3 添加 - 修复性质4 - LR\RL
判定条件:uncle 不是RED
- 自己染成
BLACK,grand染成RED - 进行双旋操作
2.1 LR:parent左旋转,grand右旋转
2.2 RL:parent右旋转,grand左旋转

3.4 添加-修复性质4-上溢-LL
判定条件:uncle 是RED
-
parent、uncle染成BLACK -
grand向上合并
2.1 染成RED,当做是新添加的节点进行处理
2.2grand向上合并时,可能继续发生上溢
2.3 若上溢持续到根节点,只需将根节点染成BLACK

3.5 添加-修复性质4-上溢-RR
判定条件:uncle 是RED
-
parent、uncle染成BLACK -
grand向上合并
2.1 染成RED,当做是新添加的节点进行处理

3.6 添加-修复性质4-上溢-LR
判定条件:uncle 是RED
-
parent、uncle染成BLACK -
grand向上合并
2.1 染成RED,当做是新添加的节点进行处理

3.7 添加-修复性质4-上溢-RL
判定条件:uncle 是RED
-
parent、uncle染成BLACK -
grand向上合并
2.1 染成RED,当做是新添加的节点进行处理

四 删除
B树中,最后真正被删除的元素都在叶子节点中

4.1 删除 – RED节点
- 直接删除,不用作任何调整

4.2 删除-BLACK节点
有 3 种情况
拥有
2个RED子节点的BLACK节点
1.1 不可能被直接删除,因为会找它的子节点替代删除
1.2 因此不用考虑这种情况拥有 1 个
RED子节点的BLACK节点BLACK 叶子节点

4.3 删除 – 拥有1个RED子节点的BLACK节点
判定条件:用以替代的子节点是 RED
将替代的子节点染成BLACK 即可保持红黑树性质


4.4 删除 – BLACK叶子节点 – sibling为BLACK
BLACK 叶子节点被删除后,会导致B树节点下溢(比如删除88)
如果
sibling至少有 1 个RED子节点
2.1 进行旋转操作
2.2 旋转之后的中心节点继承parent的颜色
2.3 旋转之后的左右节点染为BLACK
- 下图是3种需要删除的情况

- 下图对应着删除节点
88后,旋转之后的样子

4.5 删除 – BLACK叶子节点 – sibling为BLACK
判定条件:sibling 没有 1 个 RED 子节点
- 将
sibling染成RED、parent染成BLACK即可修复红黑树性质
如果 parent 是 BLACK
- 会导致parent 也下溢
- 这时只需要把 parent 当做被删除的节点处理即可

本文参考 MJ老师的 恋上数据结构与算法
本人技术水平有限,如有错误欢迎指正。
书写整理不易,您的打赏点赞是对我最大的支持和鼓励。










