红黑树在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节点即可。如下图:
- 3节点插入。这个和2节点差不多,因为最大允许4节点,所以直接插入即可。
- 4节点插入。这个需要做一下变换,因为5节点是不存在的,所以需要将3个元素的中间元素上移,在放置插入元素即可。如下图:
到这里,2-3-4的插入就完成了,下面就要讲一下删除了。
2-3-4树的节点删除
删除操作比较复杂一点,分为2节点删除和3、4节点删除,为什么分为两个,下面就清楚了。
-
3、4节点删除。直接删除即可。因为是大于2的节点,所以这个时候树的高度没有发生变化,只需要合并子节点或者将子节点用于补位即可。这里就不再画图了,因为情况有些多。
-
2节点删除。2节点删除网上也有许多方案,这里使用下面这个思路:将当前节点变为大于2节点。或者说,不让删除节点出现在2节点中。分为三个情况。
- 父节点和兄弟节点都大于2.这个情况将父节点中的一个元素下调至删除节点,形成一个3节点。兄弟节点将一个元素上调到父节点。完成删除。如下图:
- 父节点为大于2节点,兄弟节点为2节点。父节点下调一个元素,和删除元素、兄弟节点一起组成4节点,最后删除要删除的元素。完成删除。如下图:
- 父节点和兄弟节点都为2节点。父节点下调和删除节点、兄弟节点组成临时节点,删除要删除的节点。完成。如下图:
删除到这里就结束了,当删除元素为2节点并且没有兄弟节点时,无论父节点为几节点,直接删除即可。
2-3-4树的插入和删除到这里就暂时结束了,开始编写解析红黑树的插入和删除了。这里水平有限,有些地方可能想的不是很全面,欢迎大佬们的指正。这里借鉴了知乎的回答。连接如下:
红黑树的插入、删除操作
终于讲解到红黑树的插入和删除了,和上面的一样,先分析红黑树的插入(比较简单),然后再去分析红黑树的删除。这里红黑树的基本操作:左旋转、右旋转和染色默认大家都已经清楚了,如果不是很清楚,可以看一下上一篇博客。红黑树在HashMap中的应用(一)
因为红黑树也分为多种,这里以左倾红黑树为例。
红黑树的插入
红黑树的插入的节点默认为红色,上面也能看出,2-3-4树的插入默认都是当前节点,所以红黑树的插入的节点都是临时节点,默认为红色。插入有两种大情况,插入元素的父亲是红色、插入元素的父亲是黑色。下面就一一解析。
- 插入元素比黑父小。因为是左倾红黑树,所以当黑父的左节点不存在时,一定没有右节点。所以这种情况直接插入即可。
- 插入元素比黑父大。这时分为两个情况。
- 当黑父没有左节点时,直接左旋转黑父、再将父节点和插入节点换色即可。
- 当黑父有左节点时,因为这个时候没有破坏红黑树的性质,所以也是直接插入即可。
因为红父是要结合它的黑父节点一起看的,并且红黑树来源于2-3-4树,所以存在红父的情况只有3节点、4节点。3节点和4节点的区别只有红父是否存在兄弟节点。所以红父的情况分为了四种:插入节点有叔父节点且比红父小、插入节点有叔父节点且比红父大、插入节点没有叔父节点且比红父小、插入节点没有叔父节点且比红父大。
注意:此时叔父节点不可能为黑色,要不然插入之前的树就不符合红黑树的定义五。
- **插入节点有叔父节点且比红父小。**这个形态对应的是2-3-4树的4节点,所以要此时的临时5节点分裂,将树的高度加一,即将叔父节点和红父节点的颜色与祖父节点互换。因为比红父小,所以符合左倾红黑树要求。但是这时,祖父节点因为变换了颜色,所以将祖父节点当作插入节点,再执行修复操作。
- **插入节点有叔父节点且比红父大。**这个形态和上面类似,不过因为比红父大,所以不符合左倾红黑树的要求,需要再做一个转换。这里就不再画图了,脑中过一遍就能理解。
- **插入节点没有叔父节点且比红父小。**这个形态对应2-3-4树的3节点,插入此节点不会导致高度的变化,所以就是需要将红父进行右旋转。
- **插入节点没有叔父节点且比红父大。**此时树应该是右倾的,所以需要将树变为左倾,再转换为上面步骤即可,如下图:
这些插入结束后需要注意一点,因为祖父节点产生了变化,所以需要对祖父节点进行回溯,即将祖父节点当作插入节点,在执行这个步骤,直到根节点符合要求。
至此,红黑树的插入就全部例举完毕了,同时需要注意还有一点是不是对红黑树的理解又加深了?因为本人水平有限,可能有些地方有误或者不清晰,欢迎大佬的指正。
红黑树的删除
红黑树的删除比较复杂,考虑的情况要比插入多一些。这里也是举例说明,希望自己能够理清,也欢迎大家指正。
了解删除前需要了解的
了解删除前需要了解一些知识点。关于二叉树通用的删除策略。
- 删除某个节点时,可以选择该节点的前驱节点或者后继节点来替代它。这个需要思考一下,并不是很难。
- 前驱节点:该节点的左子树的最右节点。
- 后继节点:该节点的右子树的最左节点。
红黑树删除的情况
红黑树删除分为三个大情况,三个大情况又各自进行细分。如下图:
下面就需要对没有子节点的情况进行分析。
- 删除节点为红色:因为红色对应着2-3-4树的3、4节点,由上面可知,直接删除即可。没有什么好说的。结果如下图:
-
删除节点为黑色。因为黑色其实代表了一个2-3-4中的一个层级,删除层级肯定对红黑树的实际高度有影响,所以需要做一定的调整。并且按照上面的步骤,删除的黑色节点其实对应了2-3-4树中删除2节点,所以删除红黑树的黑色子叶节点需要观察父节点和兄弟节点,这也是网上大家都这样说的原因。这样就简单了,按照2-3-4树进行理解和分析吧。
还是先说说情况,总共有六种,但是中间一些情况的处理时一样的。情况如下图:(因为为左倾红黑树,所以不存在兄弟节点为红色)
- 当兄没有红子节点时,无论父是否为红,最后都变为父黑兄红。其实对应了2-3-4树中的删除2节点时,兄弟节点也为2节点。最后都是父节点和兄弟节点组成一个三节点的子树。如下图:
- 当兄有一个红色节点时,无论父是否为红,最后都是兄弟节点代替父节点、父节点代替删除节点、兄弟子节点代替兄弟节点。如下图:
- 当兄弟有两个红色时,无论父是否红,最后都是兄弟节点代替父节点、父节点代替删除节点、兄弟节点的左节点挂在删除节点下、兄弟节点的右节点代替兄弟节点、最后父节点再左旋转。如下图:
至此,红黑树的删除也讲完了。这一块不是很容易理解,我画的图也不会动,所以最后还是需要靠自己去一点点想象(。。。)中间也看了很多的博客,对于自己的理解有很大的帮助,下面就放上链接。
上面的链接只是个人的判断,当你理解其含义后,各个方法也就能懂其意思了。
讲完了红黑树的插入和删除,下面就要上实现代码了,这里直接阅读JDK的源码,分析一下HashMap中红黑树的实现(讲到现在终于靠题了)。这篇博客花了很长的时间,后面也会单独分析一下原因,技术应该没有如此难学。
就这样吧,结束。