红黑树维持平衡的方式解析

在对红黑树进行添加或者删除操作时可能会破坏这些特点,所以红黑树采取了很多方式来维护这些特点,从而维持平衡。主要通过修改颜色(颜色反转旋转节点(左旋转、右旋转来完成平衡。

左旋(RotateLeft)

逆时针旋转红黑树的两个结点,使得父结点被自己的右孩子取代,而自己成为自己的左孩子

红黑树维持平衡的方式解析_第1张图片

上图所示过程如下:

  • 1. 以X为基点逆时针旋转
  • 2. X的父节点被x原来的右孩子Y取代
  • 3. c保持不变
  • 4. Y节点原来的左孩子c变成X的右孩子

动态过程如下

红黑树维持平衡的方式解析_第2张图片

 右旋(RotateRight)

顺时针旋转红黑树的两个结点,使得父结点被自己的左孩子取代,而自己成为自己的右孩子

红黑树维持平衡的方式解析_第3张图片

上图所示过程如下:

  • 1. 以X为基点顺时针旋转
  • 2. X的父节点被x原来的左孩子Y取代
  • 3. b保持不变
  • 4. Y节点原来的右孩子c变成X的左孩子

动态过程如下

红黑树维持平衡的方式解析_第4张图片

颜色反转

就是当前节点与父节点、叔叔节点同为红色,这种情况违反了红黑树的规则,需要将红色向祖辈上传, 父节点和叔叔节点红色变为黑色,爷爷节点从黑色变为红色(爷爷节点必为黑色,因为此前是符合红黑 树规则的)。这样每条叶子结点到根节点的黑色节点数量并未发生变化,因此都其他树结构不产生影响

红黑树维持平衡的方式解析_第5张图片

红黑树调整方法

红黑树插入有五种情况,每种情况对应着不同的调整方法:

1. 新结点(A)位于树根,没有父结点

直接让新结点变色为黑色,规则2得到满足。同时,黑色的根结点使得每条路径上的黑色结点数目 都增加了1,所以并没有打破规则5

红黑树维持平衡的方式解析_第6张图片

2. 新结点(B)的父结点是黑色 

新插入的红色结点B并没有打破红黑树的规则,所以不需要做任何调整

红黑树维持平衡的方式解析_第7张图片

3. 新结点(D)的父结点和叔叔结点都是红色

两个红色结点B和D连续,违反了规则4。因此我们先让结点B变为黑色

红黑树维持平衡的方式解析_第8张图片

这样一来,结点B所在路径凭空多了一个黑色结点,打破了规则5。因此我们让结点A变为红色

红黑树维持平衡的方式解析_第9张图片

结点A和C又成为了连续的红色结点,我们再让结点C变为黑色

红黑树维持平衡的方式解析_第10张图片

经过上面的调整,这一局部重新符合了红黑树的规则

4. 新结点(D)的父结点是红色,叔叔结点是黑色或者没有叔叔,且新结点是父结点的右孩子,父结点(B)是祖父结点的左孩子

我们以结点B为轴,做一次左旋转,使得新结点D成为父结点,原来的父结点B成为D的左孩子

红黑树维持平衡的方式解析_第11张图片

这样进入了情况5

5. 新结点(D)的父结点是红色,叔叔结点是黑色或者没有叔叔,且新结点是父结点的左孩子,父结点(B)是祖父结点的左孩子 

我们以结点A为轴,做一次右旋转,使得结点B成为祖父结点,结点A成为结点B的右孩子

红黑树维持平衡的方式解析_第12张图片

接下来,我们让结点B变为黑色,结点A变为红色

红黑树维持平衡的方式解析_第13张图片

 经过上面的调整,这一局部重新符合了红黑树的规则

 

红黑树构建过程

-----------------------------

如下图:

红黑树维持平衡的方式解析_第14张图片

上图所示过程如下:

  • 1. 新插入节点默认为红色,5<10,插入到左子节点,插入后左子树深度为2(叶子节点黑色+根节点 黑色),右子树深度为也是2(叶子节点黑色+根节点黑色),满足红黑树规则。
  • 2. 新插入节点为红色,9<10,需要在左子树进行插入,再和5比较,大于5,放到5的右子树中,此 时各个叶子节点到根节点的深度依然是2,但5和9两个节点都是红色,不满足规则第4条,需要进 行左旋、右旋操作,使其符合规则。可以看出经过操作后,左右子树又维持了平衡。

---------------------------------------

红黑树维持平衡的方式解析_第15张图片

上图所示过程如下:

  • 1. 插入节点3后,可以看到又不符合红黑树的规则了,而此时的情况,需要采用颜色反转的操作,就 是把5、10两个节点变为黑色,5、10的父节点变为红色,但父节点9是根节点,不能为红色,于是再将 9 变为黑色,这样整个树的深度其实增加了1层。
  • 2. 继续插入6节点,对树深度没有影响。
  • 3. 插入7节点后,6、7节点都为红节点,不满足规则4,需要进行颜色反转调整,也就是7的父节点和 叔叔节点变为黑色,爷爷节点5变为红色。

------------------------

红黑树维持平衡的方式解析_第16张图片

上图所示过程如下:

  • 1. 继续插入节点19,对树深度没有影响,红黑树的规则都满足,无需调整。
  • 2. 插入节点32后,又出现了不满足规则4的情况,此时节点32没有叔叔节点,如果颜色反转的话,左 右子树的深度就出现不一致的情况,所以需要对爷爷节点进行左旋操作。
  • 3. 父节点取代爷爷节点的位置,父节点变为黑色,爷爷节点变为父节点的左子树变为红色。

-------------------------------

红黑树维持平衡的方式解析_第17张图片

上图所示过程如下:

  • 1. 插入节点24后,红黑树不满足规则4,需要调整。
  • 2. 此时父节点32和叔叔节点10都为红色,需要进行颜色反转,爷爷节点19变为红色,父节点、叔叔节点变为黑色,颜色反转树的深度不发生变化。

-----------------------------------

红黑树维持平衡的方式解析_第18张图片

上图所示过程如下:

  • 1.插入节点17后,未破坏红黑树规则,不需要调整。

 

你可能感兴趣的:(数据结构与算法,二叉树,红黑树)