红黑树在HashMap中的应用(二)

红黑树在HashMap中的应用(二)

​ 上一篇博客讲述了红黑树的历史来源,阐述了红黑树的五条性质,并且解释了五条性质的原因。下面就来实际操作一下,讲解一下红黑树对于节点的插入和删除。

红黑树的插入和删除

​ 在之前不止一次的说过红黑树来源于2-3-4树,所以插入和删除也是,不了解2-3-4树的插入、删除操作,很难直接上手红黑树。本文的结构就如此,先介绍2-3-4树的插入、删除操作,再去解析红黑树的对应操作。

2-3-4树的插入、删除操作
2-3-4树的节点插入

​ 2-3-4树的插入分为几个情况,2节点、3节点、4节点。下面就一一解释和画图举例。

  • 2节点插入。这个比较简单,直接将2节点转换为3节点即可。如下图:

image-20210314162205713

  • 3节点插入。这个和2节点差不多,因为最大允许4节点,所以直接插入即可。

image-20210314163816142

  • 4节点插入。这个需要做一下变换,因为5节点是不存在的,所以需要将3个元素的中间元素上移,在放置插入元素即可。如下图:

image-20210314164631591

到这里,2-3-4的插入就完成了,下面就要讲一下删除了。

2-3-4树的节点删除

​ 删除操作比较复杂一点,分为2节点删除和3、4节点删除,为什么分为两个,下面就清楚了。

  • 3、4节点删除。直接删除即可。因为是大于2的节点,所以这个时候树的高度没有发生变化,只需要合并子节点或者将子节点用于补位即可。这里就不再画图了,因为情况有些多。

  • 2节点删除。2节点删除网上也有许多方案,这里使用下面这个思路:将当前节点变为大于2节点。或者说,不让删除节点出现在2节点中。分为三个情况。

    • 父节点和兄弟节点都大于2.这个情况将父节点中的一个元素下调至删除节点,形成一个3节点。兄弟节点将一个元素上调到父节点。完成删除。如下图:

    image-20210315201220749

    • 父节点为大于2节点,兄弟节点为2节点。父节点下调一个元素,和删除元素、兄弟节点一起组成4节点,最后删除要删除的元素。完成删除。如下图:

    image-20210315201735601

    • 父节点和兄弟节点都为2节点。父节点下调和删除节点、兄弟节点组成临时节点,删除要删除的节点。完成。如下图:

    image-20210315201929131

​ 删除到这里就结束了,当删除元素为2节点并且没有兄弟节点时,无论父节点为几节点,直接删除即可。

​ 2-3-4树的插入和删除到这里就暂时结束了,开始编写解析红黑树的插入和删除了。这里水平有限,有些地方可能想的不是很全面,欢迎大佬们的指正。这里借鉴了知乎的回答。连接如下:

知乎关于红黑树的回答

红黑树的插入、删除操作

​ 终于讲解到红黑树的插入和删除了,和上面的一样,先分析红黑树的插入(比较简单),然后再去分析红黑树的删除。这里红黑树的基本操作:左旋转、右旋转和染色默认大家都已经清楚了,如果不是很清楚,可以看一下上一篇博客。红黑树在HashMap中的应用(一)

​ 因为红黑树也分为多种,这里以左倾红黑树为例。

红黑树的插入

​ 红黑树的插入的节点默认为红色,上面也能看出,2-3-4树的插入默认都是当前节点,所以红黑树的插入的节点都是临时节点,默认为红色。插入有两种大情况,插入元素的父亲是红色、插入元素的父亲是黑色。下面就一一解析。

  • 插入元素比黑父小。因为是左倾红黑树,所以当黑父的左节点不存在时,一定没有右节点。所以这种情况直接插入即可。

image-20210323100150896

  • 插入元素比黑父大。这时分为两个情况。
    • 当黑父没有左节点时,直接左旋转黑父、再将父节点和插入节点换色即可。
    • 当黑父有左节点时,因为这个时候没有破坏红黑树的性质,所以也是直接插入即可。

image-20210323100513177

​ 因为红父是要结合它的黑父节点一起看的,并且红黑树来源于2-3-4树,所以存在红父的情况只有3节点、4节点。3节点和4节点的区别只有红父是否存在兄弟节点。所以红父的情况分为了四种:插入节点有叔父节点且比红父小、插入节点有叔父节点且比红父大、插入节点没有叔父节点且比红父小、插入节点没有叔父节点且比红父大。

​ 注意:此时叔父节点不可能为黑色,要不然插入之前的树就不符合红黑树的定义五。

  • **插入节点有叔父节点且比红父小。**这个形态对应的是2-3-4树的4节点,所以要此时的临时5节点分裂,将树的高度加一,即将叔父节点和红父节点的颜色与祖父节点互换。因为比红父小,所以符合左倾红黑树要求。但是这时,祖父节点因为变换了颜色,所以将祖父节点当作插入节点,再执行修复操作。

image-20210323103124602

  • **插入节点有叔父节点且比红父大。**这个形态和上面类似,不过因为比红父大,所以不符合左倾红黑树的要求,需要再做一个转换。这里就不再画图了,脑中过一遍就能理解。
  • **插入节点没有叔父节点且比红父小。**这个形态对应2-3-4树的3节点,插入此节点不会导致高度的变化,所以就是需要将红父进行右旋转。

image-20210323111003906

  • **插入节点没有叔父节点且比红父大。**此时树应该是右倾的,所以需要将树变为左倾,再转换为上面步骤即可,如下图:

image-20210323112156656

​ 这些插入结束后需要注意一点,因为祖父节点产生了变化,所以需要对祖父节点进行回溯,即将祖父节点当作插入节点,在执行这个步骤,直到根节点符合要求。

至此,红黑树的插入就全部例举完毕了,同时需要注意还有一点是不是对红黑树的理解又加深了?因为本人水平有限,可能有些地方有误或者不清晰,欢迎大佬的指正。

红黑树的删除

​ 红黑树的删除比较复杂,考虑的情况要比插入多一些。这里也是举例说明,希望自己能够理清,也欢迎大家指正。

了解删除前需要了解的

​ 了解删除前需要了解一些知识点。关于二叉树通用的删除策略。

  • 删除某个节点时,可以选择该节点的前驱节点或者后继节点来替代它。这个需要思考一下,并不是很难。
    • 前驱节点:该节点的左子树的最右节点。
    • 后继节点:该节点的右子树的最左节点。
红黑树删除的情况

​ 红黑树删除分为三个大情况,三个大情况又各自进行细分。如下图:

image-20210323182608315

​ 下面就需要对没有子节点的情况进行分析。

  • 删除节点为红色:因为红色对应着2-3-4树的3、4节点,由上面可知,直接删除即可。没有什么好说的。结果如下图:

image-20210323182954212

  • 删除节点为黑色。因为黑色其实代表了一个2-3-4中的一个层级,删除层级肯定对红黑树的实际高度有影响,所以需要做一定的调整。并且按照上面的步骤,删除的黑色节点其实对应了2-3-4树中删除2节点,所以删除红黑树的黑色子叶节点需要观察父节点和兄弟节点,这也是网上大家都这样说的原因。这样就简单了,按照2-3-4树进行理解和分析吧。

    还是先说说情况,总共有六种,但是中间一些情况的处理时一样的。情况如下图:(因为为左倾红黑树,所以不存在兄弟节点为红色)

    image-20210323204709003

    • 当兄没有红子节点时,无论父是否为红,最后都变为父黑兄红。其实对应了2-3-4树中的删除2节点时,兄弟节点也为2节点。最后都是父节点和兄弟节点组成一个三节点的子树。如下图:

    image-20210323211215752

    • 当兄有一个红色节点时,无论父是否为红,最后都是兄弟节点代替父节点、父节点代替删除节点、兄弟子节点代替兄弟节点。如下图:

    image-20210323211409899

    • 当兄弟有两个红色时,无论父是否红,最后都是兄弟节点代替父节点、父节点代替删除节点、兄弟节点的左节点挂在删除节点下、兄弟节点的右节点代替兄弟节点、最后父节点再左旋转。如下图:

    image-20210323211559996

​ 至此,红黑树的删除也讲完了。这一块不是很容易理解,我画的图也不会动,所以最后还是需要靠自己去一点点想象(。。。)中间也看了很多的博客,对于自己的理解有很大的帮助,下面就放上链接。

删除操作类举比较详细

红黑树的插入讲的不错

​ 上面的链接只是个人的判断,当你理解其含义后,各个方法也就能懂其意思了。

​ 讲完了红黑树的插入和删除,下面就要上实现代码了,这里直接阅读JDK的源码,分析一下HashMap中红黑树的实现(讲到现在终于靠题了)。这篇博客花了很长的时间,后面也会单独分析一下原因,技术应该没有如此难学。

​ 就这样吧,结束。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值