(1)叔叔节点是黑色:
这种情况下又分了两种情况:
第一种情况:新插入节点为父节点的左孩子

文章插图
第二种情况:新插入节点为父节点的右孩子

文章插图
按照第一遍的思路,我们对这两种情况执行同样的操作,最终也能保证红黑树的5条特征 。
到了这一步,插入操作的所有情况就讲解完毕 。另外关于左旋和右旋的知识我在这里不再说明了,因为你看到了红黑树这个程度,相信也一定看过平衡二叉树 。左旋右旋哪几种情况,都会有介绍到 。
3、删除节点
红黑树的删除说实话更加的复杂,如果你看过算法导论的话应该能明白一点,我们在这里也进行一个大概的讲解 。
删除大致分了三种情况,
(1)第一种情况:要删除的节点有零个子节点
这种情况下最简单,也就是删除的是根节点或者是叶子节点(这里的叶子节点都是指非NULL的叶子节点),根节点直接删除即可 。如果叶子节点是红色的,也可以直接删除,如果叶子节点是黑色的,那么就需要进行调整,调整的步骤和插入时调整的步骤一样 。
(2)第二种情况:要删除的节点有一个子节点
这时候 。把子节点的值替换掉要删除的节点的值 。

文章插图
现在我们的5把11替换掉之后,又回到了第一种情况 。如果节点5是红色的,可以直接删除,如果节点5是黑色的,那么就需要进行调整,此时的节点5就是叶子节点 。调整的步骤和插入时调整的步骤一样 。
(3)第三种情况:要删除的节点有两个子节点
现在删除的节点有两个子节点,同样的我们可以执行第二种情况的操作,

文章插图
若节点13之前是叶子节点,那就和第一种情况一样了,如果节点13是红色的,可以直接删除,如果节点13是黑色的,那么就需要进行调整,此时的节点13就是叶子节点 。调整的步骤和插入时调整的步骤一样 。
若节点13之前还有子节点,那就和第二种情况一样了 。那就继续替换和判断 。
以上呢就是删除的情况,最后一种情况是修改,这种情况是查找和插入的结合体,也就是先找到要修改的元素,修改完值之后,继续进行调整即可 。
现在还有最后一个问题了,都说红黑树很重要,为什么重要呢?我们来看一下使用场景 。
四、使用场景
红黑树的应用真的是太多了,比如说JAVA中的HashMap和TreeMap 。还有就是linux也经常使用到 。这种数据结构在面试的时候是一个常问问题,希望大家能够明白和理解 。如何用java手撕红黑树,在后续文章中我会添加 。如有问题还请批评指正 。
推荐阅读
- 4大恶习导致皮肤干燥 冬季护肤你得这么做!
- 为什么这么多人喜欢喝正山小种红茶
- 开自动挡车有“四不准”,经常这么做的,肯定没少往修理厂跑
- 手指瘢痕挛缩
- 都匀毛尖、湄潭翠芽、遵义红茶……贵州这么多茶,你pick哪一个?
- Redis中的发布订阅模式用代码实现就是这么简单
- 喝春茶原来还有这么多讲究
- 吃了多年桃子才知道,原来去除桃毛这么简单,学会了受用一生
- 没想到苏州这个岛藏了这么多好吃好玩的,住一晚包吃住人均才200
- 情绪的负面影响 负面情绪竟然可以引发这么多疾病
