JAVA基础集合框架【四】HashMap之源码分析红黑树-删除
文章首发于:clawhub.club
这篇文章学习红黑树的删除操作,阅读分析了几篇关于红黑树删除的文章,好复杂。
贴出红黑树的性质:
- 每个结点要么是红的,要么是黑的。
- 根结点是黑的。
- 每个叶结点(叶结点即指树尾端NIL指针或NULL结点)是黑的。
- 如果一个结点是红的,那么它的俩个儿子都是黑的。
- 对于任一结点而言,其到叶结点树尾端NIL指针的每一条路径都包含相同数目的黑结点。
红黑树的删除操作分为两步:
一、按照普通的二叉查找树删除节点。
- 如果删除的节点下只有一个非空子节点,则直接删除这个节点,用它唯一的子节点顶替它的位置。
- 如果它是叶子节点,直接删除。
- 如果它有两个子节点且都不为空。则把它的中序遍历后的直接后继节点内容复制到它的位置,它的后继节点不可能有两个非空子节点,这样就转化成上面两种情况了,直接删除这个后继节点。
二、修正红黑树
在删除节点之后,红黑树的性质可能遭到破坏,如果删除的是红色节点,对原树没有影响。
如果删除的结点是黑色结点,原红黑树的性质可能会被改变,我们要对其做修正操作。
- 如果删除结点不是树唯一结点,那么删除结点的那一个支的到各叶结点的黑色结点数会发生变化,此时性质5被破坏。
- 如果被删结点的唯一非空子结点是红色,而被删结点的父结点也是红色,那么性质4被破坏。
- 如果被删结点是根结点,而它的唯一非空子结点是红色,则删除后新根结点将变成红色,违背性质2。
以下就懵逼了!!!
参考下面两篇文章
https://zhuanlan.zhihu.com/p/24367771这个吧。
https://www.cnblogs.com/skywang12345/p/3624343.html
删除黑色节点的时候,修复工作忒复杂,等以后闲了的时候再分析。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 ClawHub的技术分享!