加入收藏 | 设为首页 | 会员中心 | 我要投稿 核心网 (https://www.hxwgxz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

看了这么多篇红黑树文章,你理解了嘛?

发布时间:2019-09-23 16:23:09 所属栏目:建站 来源:Java的架构师技术栈
导读:很早之前就想写一篇关于红黑树的文章,但是由于担心自己理解的不透彻,就一直不敢下笔。于是在重新看了很多篇文章和资料之后,决定彻彻底底的把红黑树搞清楚。也希望让你在面试中游刃有余。OK,废话不多说,开始今天的文章。 整篇文章的思路是这样的,红黑

我们还是举个例子,比如我们在最开始的红黑树基础之上插入节点21,此时会发生什么情况呢?

看了这么多篇红黑树文章,你理解了嘛?

此时还是老规矩,对照着红黑树的5个特征一个一个来看,只要是违反了一条就需要做出调整。我们来看一下:

(1)每个节点只有两种颜色:红色和黑色。这一条满足。

(2)根节点是黑色的。这一条也满足。

(3)每个叶子节点(NIL)都是黑色的空节点。这一条满足。

(4)从根节点到叶子节点,不会出现两个连续的红色节点。这一条发现不满足。

就是上面这一条规则没有满足,所以我们此时需要调整?问题来了如何调整呢?因为直接看父节点没办法实现,所以还需要观察另外的节点,也就是新节点的叔叔节点。根据叔叔节点的颜色来调整。调整的方式有两种:变色和旋转。

(1)叔叔节点是红色:

此时插入的节点是21,但是叔叔节点是27,更好是红色。我们直接来看调整的步骤:

第一步:把新节点21的父节点22变成黑色。

看了这么多篇红黑树文章,你理解了嘛?

此时重新看一下是否满足红黑树的五条特征了没,一条一条发现,第五条没有满足,也就是从任何一个节点出发,到叶子节点,这条路径上没有相同数目的黑色节点。比如从25出发。这时候怎么办呢?那就继续调整。

第二步:把22的父节点25变成红色

看了这么多篇红黑树文章,你理解了嘛?

这时候还是老规矩,不要嫌弃麻烦,因为只有经历了一步又一步的麻烦之后,你才能牢记那5条规则特征。我们对照之后会发现节点25和节点27是两个连续的红色节点,这时候又破坏了规则4。怎么办呢?那就继续调整就OK了。

难道这时候还要继续往上调整吗?如果你这样做就错了,因为不断地往上调整最后就会把根节点变成了红色,会走进死胡同。我们往下走。

第三步:把节点27变成黑色

看了这么多篇红黑树文章,你理解了嘛?

来吧,继续重新审查那5条规则特征。很明显节点17和节点25是两个连续的红色,又破坏了。是不是心太累了,调整了这么久,还是没有保证那5条规则,感觉是不是还没有平衡二叉树好。如果你现在有这种感觉,我只能说,希望你继续坚持下去,胜利就在眼前。

第四步:把节点17和节点18都变成黑色节点

看了这么多篇红黑树文章,你理解了嘛?

来来来,现在你再对照一下那5条规则,是不是完全保证了。写到这真的是太累了,和你读这篇文章的感觉一样一样的,不过这种情况也只是插入情况中的一种。继续往下看:

(1)叔叔节点是黑色:

这种情况下又分了两种情况:

第一种情况:新插入节点为父节点的左孩子

看了这么多篇红黑树文章,你理解了嘛?

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

看了这么多篇红黑树文章,你理解了嘛?

按照第一遍的思路,我们对这两种情况执行同样的操作,最终也能保证红黑树的5条特征。

到了这一步,插入操作的所有情况就讲解完毕。另外关于左旋和右旋的知识我在这里不再说明了,因为你看到了红黑树这个程度,相信也一定看过平衡二叉树。左旋右旋哪几种情况,都会有介绍到。

3、删除节点

红黑树的删除说实话更加的复杂,如果你看过算法导论的话应该能明白一点,我们在这里也进行一个大概的讲解。

删除大致分了三种情况,

(1)第一种情况:要删除的节点有零个子节点

这种情况下最简单,也就是删除的是根节点或者是叶子节点(这里的叶子节点都是指非NULL的叶子节点),根节点直接删除即可。如果叶子节点是红色的,也可以直接删除,如果叶子节点是黑色的,那么就需要进行调整,调整的步骤和插入时调整的步骤一样。

(2)第二种情况:要删除的节点有一个子节点

这时候。把子节点的值替换掉要删除的节点的值。

看了这么多篇红黑树文章,你理解了嘛?

现在我们的5把11替换掉之后,又回到了第一种情况。如果节点5是红色的,可以直接删除,如果节点5是黑色的,那么就需要进行调整,此时的节点5就是叶子节点。调整的步骤和插入时调整的步骤一样。

(3)第三种情况:要删除的节点有两个子节点

现在删除的节点有两个子节点,同样的我们可以执行第二种情况的操作,

看了这么多篇红黑树文章,你理解了嘛?

若节点13之前是叶子节点,那就和第一种情况一样了,如果节点13是红色的,可以直接删除,如果节点13是黑色的,那么就需要进行调整,此时的节点13就是叶子节点。调整的步骤和插入时调整的步骤一样。

若节点13之前还有子节点,那就和第二种情况一样了。那就继续替换和判断。

以上呢就是删除的情况,最后一种情况是修改,这种情况是查找和插入的结合体,也就是先找到要修改的元素,修改完值之后,继续进行调整即可。

现在还有最后一个问题了,都说红黑树很重要,为什么重要呢?我们来看一下使用场景。

四、使用场景

(编辑:核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读