ARTS (第10周)
最近在理解红黑树。
但红黑树的各种资料给我的感觉更多的是一个个的公式去套用。
我感觉是作者先设计出红黑树的基础结构,然后根据因为树形的结构,所以只要每次发生新增/删除只需要逐级向上处理修改的话效率就极高,然后红黑树作者根据这种思路,就开始统计做计算了。
红黑树的作者在设计这种结构的时候,这些的计算应该都是一个个情况的罗列、推导和测试出来.
因此,我感觉红黑树新增删除给我的感觉更多像一套套公式。
(个人的一点理解,可能有误)我感觉红黑树的调整公式可以有非常多种,只不过现有的公式比较完善。
本周:
红黑树
Algorithm 算法
红黑树(补全删除部分)
参考自JDK8 TreeMap源码
1 | package jdk8test; |
Review 英文文章
node.js的文档,简略了解node.js
Tip 技巧
JDK源码treemap的红黑树的删除解析
其实就是各种情况的判断和解析,jdk源码里写的更精巧。
1 | private void deleteEntry(Entry<K,V> p) { |
红黑树删除的个人总结
像JDK源码里,红黑树的删除分为了两部,第一步是替换或者删除,第二部分是调整
1、首先是替换/删除部分
这部分较容易理解,主体就是寻找后驱节点 替换或者删除,然后根据以下情况,判断是否需要进行调整
PS:删除的是红色节点的时候是不需要调整的。下面我就不再强调了。
可能1
删除节点有1个子节点
直接替换删除节点
如果删除节点是黑色的 将删除节点当作关注节点开始调整
可能2
删除节点是根节点 并且没有后代 直接清空
可能3
删除节点是有2个子节点
找到后驱节点 替换删除节点的属性
如果后驱节点是黑的 将后驱节点当作关注节点开始调整
2、调整部分
调整,其实就是一个一个情况的处理方案,或者说是公式。
调整操作 ,因为是存在2种可能,并且两种可能是呈现镜像的关系的
所以这里我只说一种 (删除节点是左节点,)
近侄子节点的概念为 兄弟节点有2个子节点
而关注节点如果是左节点
近侄子节点就为兄弟节点的左节点
远侄子节点就为兄弟节点的右节点
反之亦然
情况1 兄弟节点是红色的
兄弟和父节点互换颜色,然后父节点左旋
进入情况2、情况3判断
情况2 兄弟节点的后代都是黑的(空节点也算黑)
设置兄弟节点为红色
关注节点更改为关注节点的父节点 重新开始判断(因为父节点可能是红色)
如果关注节点不需要调整了,就将关注节点设置为黑色后结束。
情况3 兄弟节点的后代有红色的节点,并且远侄子节点是黑色节点(近侄子为红)
设置红色的近侄子节点为黑色后,兄弟节点为红,左旋兄弟节点
重置兄弟节点后进入判断4
情况4 兄弟节点的后代有红色的节点并且近侄子节点是红色节点
父节点的颜色复制给兄弟节点 将父节点改成黑色,左旋关注节点
然后将根节点设置为黑色。结束。
ps:如果发现我的总结有问题,欢迎联系下我!谢谢!
QQ:851127936
Share 分享
红黑树详细分析
https://segmentfault.com/a/1190000012728513#articleHeader6
其实最近看的红黑树文章很多很多个,我就把写的比较好的列出来了,但总感觉有差漏。
因此,最后我自己根据JDK的treemap源码做了一个小结。