红黑树的插入过程详解
注意:在学习红黑树(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