在线操作红黑树的查找,添加、删除操作:https://www.cs.usfca.edu/~galles/visualization/RedBlack.html
转知乎的一篇理解:
https://zhuanlan.zhihu.com/p/22800206
以下是原作者内容:
红黑树也是一颗二叉排序树,节点的删除也是分为3种情况即,将要删除的节点没有子节点,将要删除的节点下有一个子节点,将要删除的节点下有两个子节点。有不了解的可以参考我们前面介绍二叉搜索树的文章,这里不再赘述。我们主要介绍各种不同情况下节点的修复是怎样操作的。在介绍之前我们再次回顾一下红黑树的5个特性,这非常重要,因为删除节点后,很可能会破坏这5个特性,我们的修复操作就是使它重新满足这5个特性。
所有节点都是红色或者黑色
根节点为黑色
所有的 NULL 叶子节点都是黑色
如果该节点是红色的,那么该节点的子节点一定都是黑色
所有的 NULL 节点到根节点的路径上的黑色节点数量一定是相同的
下面我们开始讨论修复操作(下面的叶子节点都是指非NULL的叶子节点):
A. 删除的是叶子节点且该叶子节点是红色的 —> 无需修复,因为它不会破坏红黑树的5个特性
B. 删除的是叶子节点且该叶子节点是黑色的 —> 很明显会破坏特性5,需要修复。
C. 删除的节点(为了便于叙述我们将其称为P)下面有一个子节点 S,对于这种情况我们通过 将P和S的值交换的方式,巧妙的将删除P变为删除S,S是叶子节点,这样C这种情况就会转 换为A, B这两种情况:
C1: P为黑色,S为红色 —> 对应 A 这种情况
C2: P为黑色或红色,S为黑色 — > 对应 B 这种情况
D. 删除的节点有两个子节点,对于这种情况,我们通过将P和它的后继节点N的值交换的方 式,将删除节点P转换为删除后继节点N,而后继节点只可能是以下两种情况:
D1: N是叶子节点 — > 对应情况 A 或 B
D2: N有一个子节点 ---- > 对应情况 C
所以通过上面的分析我们发现,红黑树节点删除后的修复操作都可以转换为 A 或 B这两种情况,而A不需要修复,所以我们只需要研究B这种情况如何修复就行了。
下面我们讨论如何修复B中情况: