红黑树的延伸
查找
插入
插入的流程
具体判断位置流程
深入插入情景
背景
深入4种插入情景(除了情景二其他都是在叶子节点上进行操作)
情景一:红黑树为空树
- 这个是最近简单的,我们直接将我们的插入节点作为根节点就OK,但是要注意,根节点的颜色为黑色,所以还需要将我们的节点的颜色设为黑色
- 流程
- 设为根节点
- 设置节点颜色为黑色
情景二:插入节点的Key已存在
- 插入的节点已存在,既然红黑树总是保持平衡的,插入前就是保持平衡的,那么插入的节点设置为当前节点的颜色,在将节点的值进行更新
- 流程
- 将我们插入节点(也就是背景图中的I)设置为当前节点(非插入节点)的颜色
- 更新当前节点的值为插入节点的值
情景三:插入节点的父节点为黑色
- 由于插入的结点是红色的,当插入结点的黑色时,并不会影响红黑树的平衡,直接插入即可,无需做自平衡。
- 流程
- 直接进行插入
情景四:插入节点的父节点为红色
由于插入节点的颜色为红色,但是它的父节点的颜色也是红色,违反了红黑树的规范,那该父节点不可能成为根节点,所以后续的旋转操作需要祖父节点的加入
情景四又有更多的子情景,听我细细说来哈哈哈⚡
插入情景4.1:叔叔结点存在并且为红结点
如果叔叔节点为红结点的话,那根据红黑树的规范来看,当前插入子树的红黑层数情况是
黑红红
,最简单的方式也就是改变颜色,后我们的红黑层数情况是红黑红
流程
- 将P和S设置为黑色
- 将PP设置为红色
- 把PP设置为当前插入结点
-
我们来进行对PP该节点的判断(因为进行插入后将PP节点又设置为红结点了)
- 如果PP节点是有父节点的
- PP节点是黑色的
- 无需做任何的处理
- PP节点是红色的
- 根据红黑树的约束,此时的红黑树已经是不平衡的,我们需要将PP节点作为插入节点进行,继续做插入操作自平衡处理,直到红黑树为止
- PP节点是黑色的
- 如果PP节点已经是根节点了,根据红黑树的约束我们需要将PP节点设为黑节点
- 我们需要思想一个问题,我们现在的红黑层树为
黑黑红
,从另一个层面来讲,我们从根节点到我们的叶子节点之间的路径中,黑色节点增加了 这是唯一一种会增加红黑树黑色结点层数的情况
- 我们需要思想一个问题,我们现在的红黑层树为
这又得出来一个结论—>红黑树的生长是自底向上的,而和普通的二叉查找树是不同的,二叉查找树是自顶向下的
- 如果PP节点是有父节点的
插入情景4.2:叔叔结点不存在或为黑结点,并且插入结点的父亲结点是祖父结点的左子结点
单纯从插入前来看,也即不算情景4.1自底向上处理时的情况,叔叔结点非红即为叶子结点(Nil)。
- 因为如果叔叔结点为黑结点,而父结点为红结点,那么叔叔结点所在的子树的黑色结点就比父结点所在子树的多了,这不满足红黑树的性质5。后续情景同样如此,不再多做说明了。
前文说了,需要旋转操作时,肯定一边子树的结点多了或少了,需要租或借给另一边。插入显然是多的情况,那么把多的结点租给另一边子树就可以了
插入情景4.2.1:插入结点是其父结点的左子结点
- 我们需要维护红黑树自平衡的规范,两边的子树都平衡的
- 流程
- 将P设为黑色
- 将PP设为红色
- 对PP进行右旋
-
插入情景4.2.2:插入结点到其父结点的右子结点
- 跟4.2.1的情况是一样的不多说明了
- 流程
- 我们将P进行左旋,同时设为插入节点
- 得到了4.2.1的情况
- 之后我们在进行左旋,得到平衡的红黑树
-
插入情景4.3:叔叔结点不存在或为黑结点,并且插入结点的父亲结点是祖父结点的右子结点
该情景对应情景4.2,只是方向反转,不做过多说明了,直接看图。
插入情景4.3.1:插入结点是其父结点的右子结点
- 流程:
- 将P设为黑色
- 将PP设为红色
- 对PP进行左旋
-
- 流程:
插入情景4.3.2:插入结点是其父结点的左子结点
流程:
- 对P进行右旋
- 把P设置为插入结点,得到情景4.3.1
- 进行情景4.3.1的处理
-
插入所有的情景后,好好做功课的又会说,那上面所有的插入情况都是第一次进行插入有没有包含自下向上处理的情况吗?答案是肯定的
理由很简单,但每棵子树都能自平衡,那么整棵树最终总是平衡的
删除
ok,屏幕前的同学,请记住:深吸一口气,带好你的AirPods Pro(降噪打开),有点难的地方来喽!,尽量不要被打扰哦,记住,不会不清楚的话,拿出你们的笔记本,画着写着,一遍不会n遍,ok,开始
ok,二叉树删除节点找的替换结点有三个情景
ok,介绍完删除结点找替换结点的情景后
接下来,讲一个重要的思路:删除结点被替代后,在不考虑结点的键值的情况下,对于树来说,可以认为删除的是
替代结点
!话很直接,我们看下面的图。在不注意其他因素的情况下,图17的红黑树最终结果是删除了Q所在位置的结点!这种思路非常重要,大大简化了后文讲解红黑树删除的情景!
二叉树删除情景
ok,删除情景也搞ok了,我们就看看删除操作时的情景
ok,我们来到最难的时候,这时候不要放弃,馅饼就在前面,加油!!!
详解9种删除操作情景
删除情景1:替换结点是红色结点
删除情景2:替换节点是黑色结点
我们替换后倒是不需要去大致的注意连续红色的结点出现,所以我们要注意的是我们的根节点到我们的叶子节点的黑结点也就多了一个,所以要进行旋转的操作,对于情况的左旋右旋
删除情景2.1:替换结点是其父结点的左子结点
平衡后的图怎么不满足红黑树的性质?前文提醒过,R是即将替换的,它还参与树的自平衡,平衡后再替换到删除结点的位置,所以R最终可以看作是删除的
另外上幅图是考虑到第一次替换和自底向上处理的情况,如果只考虑第一次替换的情况,根据红黑树性质,SL肯定是红色或为Nil(因为R作为替换节点到树底时,这时R已经是删除结点后进行删除了,,也就是只剩SL了),所以最终结果树是平衡的。如果是自底向上处理的情况,同样,每棵子树都保持平衡状态,最终整棵树肯定是平衡的。后续的情景同理,不做过多说明了
删除情景2.2:替换结点是其父结点的右子结点
总结(删除总结)
红黑树删除后自平衡的处理可以总结为:
啊,我是真的吐了,本章参考于安卓大叔的红黑树理解,但是所有的文字都是经过自己的理解敲上来的(脑子要炸掉),到这里是真的完了,现在已经是晚上的2:38了,我也该睡觉觉了,明天再复习一遍!!!