情况1:
插入新节点40 , 此时它的父节点为红色,并且它的叔叔节点(即51)也为红色。此时我们需要进行 变色 操作 。将该节点的父亲节点、叔叔节点都变为黑色,祖父节点变为红色。
此时上图已经满足红黑树的规则 。但有的时候我们经过了变色操作后,仍不满足红黑树的规则,会遇到下面的情况 。
情况2:
如图,我们插入新的节点53,在按情况1的操作变色后,变成了这样:
最后我们说一下情况3的情景,如下图:
我们向树中插入新节点37,在按情况1的操作变色后,变成了这样:
情况3:
3种情况我们说明完了,但是你可能还会有这样的疑问,什么时候进行左旋,什么时候进行右旋红黑树的go语言;什么时候以父节点为支点旋转 , 什么时候又以祖父节点为支点旋转?
那么我们可以总结一下,当遇到连续的红色节点应该怎么办: 当前节点我们叫它X,如果X相对于父节点的左右位置和父节点相对于祖父节点的左右位置相同,此时,就以祖父节点为支点,进行反向旋转 。例如:X为父节点的左孩子,X的父节点同样也是其祖父节点的左孩子,此时以祖父节点为支点进行右旋红黑树的go语言;
如果X相对于父节点的左右位置和父节点相对于祖父节点的左右位置不同,则以X的父节点为支点 , 进行旋转,旋转方向与X相对于父节点左右位置相反 。例如:X为其父节点的左孩子 , X的父节点为祖父节点的右孩子,此时以X的父节点为支点进行一次右旋 。
在红黑树中删除节点,肯定要涉及到要删的这个节点是红色的还是黑色的 。删除红色比较简单,我们先说一下删除红色节点 。
删除节点要考虑这个节点所处的位置,所以我们罗列一下红色的节点所有可能的位置情况 。
你可能会发现为什么少了一种情况?它不能只有左子树或者只有右子树吗?我们可以看下图:
很明显,这四种情况都不符合红黑树的规则,所以根本不会出现这种情况 。
而对于既有左子树也有右子树的情况 。我们可以先和普通的二叉搜索树的删除操作一样,将它与前驱或者后继交换一下。它就又变成第一种情况——成为了一个叶子节点 。所以我们只需考虑当它是叶子节点的情况 。
接下来我们看一下当要删除的节点是黑色的时候应该怎么办 。
同样我们列一下节点位置可能的情况:
第三种情况和删除红色节点时的处理方法一样,可以转换成第一种或第二种情况,所以我们只关心前两种情况 。
当要删除的黑色节点只有一个子树时:
最后我们看一下最难处理的一种情况 。
要删除的黑色节点是叶子节点时:
情况1:待删除黑色节点20,它的兄弟节点为红色 。
操作方法为:将远侄子节点变黑,兄弟节点与父亲节点互换颜色,最后以父节点为支点进行 左旋。(为什么是左旋?因为待删除的20是左孩子 , 我们要将左子树长度拉长,将它沉下来,使它变成多余的节点好删除它,如果它是右孩子,则进行右旋)
操作后如下图就完成了 。
情况3:待删除黑色节点20 , 它的兄弟节点为黑色,但它没有红色的远侄子节点(即nil点,记?。?nil点算黑色),只有红色的近侄子节点 。
操作后如下图:
此时有了红色的远侄子,就满足了情况2,再按情况2进行一次操作就完成了 。
情况4:待删除黑色节点20,它的兄弟节点为黑色,远侄子、近侄子节点都没有 。(即两个nil节点 , nil节点算黑色)
我们将上图红黑树按流程演示一下:
推荐阅读
- 电脑自动返回什么意思呀,电脑老是自动返回桌面什么原因
- jquery拖拽布局与保存,jq拖拽功能
- 电脑怎么卸载显卡驱动,电脑卸载显卡驱动后黑屏
- 直播图书教程,如何做图书直播
- c语言常用函数 python ln函数怎么打
- 光夜安卓微信能换到ios吗,光与夜之恋怎么换微信账号
- 显卡坏了怎么打英雄联盟,显卡坏了游戏画面
- 模拟飞行游戏图片,模拟飞行游戏手机游戏
- linux命令lpr linux命令lp