【数据结构】红黑树的学习(二)

红黑树的插入过程详解

注意:在学习红黑树(RBT)之前,必须先了解二叉搜索树(BST)和平衡二叉树(AVL)的基本定义和性质。



红黑树的查找

红黑树的查找过程:
与BST、AVL相同:即从根出发,左小、右大,若查找到一个空叶节点,则查找失败。


以下是本篇文章主要内容:

红黑树的插入

插入新结点的主要流程如下:
1、先查找,从而确定要插入的位置(查找的原理同二叉排序树[BST]),插入新结点又分为两种情况:

  • 若新结点是根结点,则染为黑色;
  • 若新结点非根结点,则染为红色。

2、判断插入新结点后的红黑树,是否还符合红黑树的定义(即:左根右,根叶黑,不红红,黑路同。见《红黑树的学习(一)》)
以上分为两种情况:

  • 若插入新结点后,依然满足红黑树定义,则插入结束;
  • 若插入新结点后,不满足红黑树定义,则需要调整,使其重新满足红黑树定义。

3、如何调整?调整规则如下:
调整操作的关键在于:要看新插入结点的叔叔结点的颜色(红色?还是黑色?)
对红黑树的调整,分为以下两种情况:

  • 若叔叔结点为黑色:旋转 + 染色
    注意:红黑树的旋转方式跟平衡二叉树(AVL)平衡时的旋转方式一样,分为四种情况:
    LL型:右单旋,父结点换爷结点 + 染色
    RR型:左单旋,父结点换爷结点 + 染色
    LR型:左、右双旋,孩结点换爷结点 + 染色
    RL型:右、左双旋,孩结点换爷结点 + 染色
  • 若叔叔结点为红色:染色 + 变新
    注意:叔结点、父结点、爷结点三者进行染色,爷结点变为新结点继续进行调整(即:继续判断其叔叔结点的颜色)。

红黑树插入的全过程演示实例

红黑树插入的要求:

从一棵空的红黑树开始,一次插入:20,10,5,30,40,57,3,2,4

插入20:

新结点是根结点,染为黑色:
在这里插入图片描述

插入10:

新结点非根结点,染为红色,依然满足红黑树的定义(即:左根右,根叶黑,不红红,黑路同):
在这里插入图片描述

插入5:

新结点非根结点,染为红色后,违反了“不红红”,则需要调整:
在这里插入图片描述
调整如下:由于叔叔结点为黑色,则旋转 + 染色

  • 旋转:LL型:右单旋
    在这里插入图片描述
  • 染色:
    在这里插入图片描述

插入30:

新结点非根结点,染为红色后,违反了“不红红”,则需要调整:
在这里插入图片描述
调整如下:由于叔叔结点为红色:染色 + 变新

  • 染色:叔结点、父结点、爷结点,三者变色
    在这里插入图片描述
  • 变新:爷结点作为新结点,继续进行调整:由于新结点是根结点,所以染黑。
    在这里插入图片描述

插入40:

新结点非根结点,染为红色后,违反了“不红红”,则需要调整:
在这里插入图片描述
调整如下:由于叔叔结点为黑色,则旋转 + 染色

  • 旋转:RR型:左单旋 (过程省略:类似“插入5”的过程)
  • 染色

调整后的树为:
在这里插入图片描述

插入新结点时的注意事项:

关于插入新结点的过程,我已经基本展示完了,不过,需要注意的是:

  • 如果叔叔结点为黑色,旋转方式有四种,我只展示其中两种,另外两种的旋转方式与平衡二叉树(AVL)一样。
  • 如果叔叔结点为红色,关于变新这一操作,我只展示了根结点作为新结点后的调整操作,若红黑树比较高,非根结点作为了新结点,则找它的叔叔结点并判断颜色,再次依照调整规则继续进行调整

总结

以上就是今天讲解的全部内容,而关于红黑树也就这么多内容,之后,可以做一些关于红黑树定义、性质、插入结点的基本习题就可以了
这里,我推荐一个算法可视化的网站,可以帮助更好的观察算法的整体过程
网站如下:https://www.cs.usfca.edu/~galles/visualization/Algorithms.html
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值