数据结构之红黑树插入详解

目录

一、概述

二、红黑树插入

三、总结


一、概述

红黑树是一颗二叉平衡树,并且查找不会破坏树的平衡,所以查找跟二叉平衡树的查找没有什么区别,可以看前面的文章进行学习,这里不再过多阐述。本节我们主要总结红黑树插入相关的知识。

二、红黑树插入

红黑树的插入包含两个步骤:

  • 在树中查找插入的位置;
  • 插入后自平衡;

查找流程:

  1. 从根节点开始查找;
  2. 若根节点为空,那么插入节点作为根节点,结束;
  3. 若根节点不为空,那么把根节点作为当前节点;
  4. 若当前节点为null,返回当前节点的父节点,结束;
  5. 若当前节点key等于查找key,那么该key所在节点就是插入节点,更新节点的值,结束;
  6. 若当前节点key大于查找key,把当前节点的左子节点设置为当前节点,重复步骤4;
  7. 若当前节点key小于查找key,把当前节点的右子节点设置为当前节点,重复步骤4;

经过上面几个步骤已经找到节点插入的位置了,把插入节点放到正确的位置就可以了。

注意:插入节点应该是红色。

原因:根据红黑树特性之一【任意一节点到每个叶子节点的路径都包含数量相同的黑节点】,红色在父节点(如果存在)是黑色节点时,红黑树的黑色平衡不会被破坏,所以不需要进行自平衡操作。但如果插入节点是黑色,那么插入位置所在的子树黑色节点总是多1,必须做自平衡操作。

红黑树插入分很多种情况:

【a】红黑树为空树

因为红黑树为空树,所以直接将插入节点作为红黑树的根节点,然后注意红黑树跟节点必须为黑色,所以还需要将插入节点的颜色变为黑色,这种情况是最简单的红黑树插入操作。

处理步骤总结:

  • 把插入节点作为根节点
  • 把节点设置为黑色

【b】插入节点的Key已存在

根据key值,在红黑树中查找已经存在相同key的节点,因为插入之前红黑树已经是平衡的,所以只需要将插入节点的颜色设置为已存在的相同key的节点的颜色,然后更新key值即可。

处理步骤总结:

  • 把插入节点设为当前节点的颜色;
  • 更新当前节点的值为插入节点的值;

【c】插入节点的父节点为黑节点

因为红黑树规定新插入节点的颜色为红色,当插入节点的父节点为黑色时,并不会破坏【任意一节点到每个叶子节点的路径都包含数量相同的黑节点】特性,所以无需进行平衡操作,直接插入即可。

处理步骤总结:

  • 无需进行平衡操作,直接插入新节点

【d】插入节点的父节点为红节点

这种情况是最复杂的,因为红黑树规定新插入节点的颜色为红色,当插入节点的父节点为红色时,必然就破坏了【任意一节点到每个叶子节点的路径都包含数量相同的黑节点】特性,所以这种情况必须进行自平衡操作。

这种情况也分为下面好几种场景:

  • 【d-1】叔叔节点存在并且为红节点;
  • 【d-2】叔叔节点不存在或为黑节点,并且插入节点的父亲节点是祖父节点的左子节点;

【d-1】叔叔节点存在并且为红节点【叔叔节点:S 插入节点:I 父节点:P 祖父节点:PP】

从红黑树【每个红色节点的两个子节点一定都是黑色】特性可以推测出插入节点的祖父节点PP肯定为黑节点,因为不可以同时存在两个相连的红节点。那么此时该插入子树的红黑层数的情况是:黑红红。最简单的处理方式是把其改为:红黑红。

示意图如下所示:

 

可见,插入节点的祖父节点PP已经是红色节点,如果PP的父节点是黑色,那么满足【不能存在相连的两个红色节点】特性;如果PP的父节点是红色,那么PP红色,PP父节点也是红色,又得从PP节点出发,继续进行插入自平衡操作,一直到红黑树平衡为止。

【d-2】叔叔节点不存在或为黑节点,并且插入节点的父亲节点是祖父节点的左子节点【叔叔节点:S 插入节点:I 父节点:P 祖父节点:PP】

如果叔叔节点为黑节点,而父节点为红节点,那么叔叔节点所在的子树的黑色节点就比父节点所在子树的多1了,这不满足红黑树【任意一节点到每个叶子节点的路径都包含数量相同的黑节点】特性。下图也可以看出不满足:

【d-2】又可以分为如下两种:

  • 【d-2-1】插入节点是其父节点的左子节点;
  • 【d-2-2】插入节点是其父节点的右子节点;

【d-2-1】插入节点是其父节点的左子节点

处理步骤总结:

  • P设置为黑色
  • PP设置为红色
  • 对PP节点进行右旋

【d-2-2】插入节点是其父节点的右子节点

处理步骤总结:

  • 对P节点进行左旋操作就得到上面一种情况【d-2-1】【插入节点是其父节点的左子节点】
  • I设置为黑色
  • PP设置为红色
  • 对PP节点进行右旋

【d-3】叔叔节点不存在或为黑节点,并且插入节点的父亲节点是祖父节点的右子节点

【d-3】可以分为如下两种情况:

  • 【d-3-1】插入节点是其父节点的右子节点
  • 【d-3-2】插入节点是其父节点的左子节点

【d-3-1】插入节点是其父节点的右子节点

处理步骤总结:

  • P设置为黑色
  • PP设置为红色
  • 对PP节点进行左旋

【d-3-2】插入节点是其父节点的左子节点

处理步骤总结:

  • 对P节点进行右旋操作就得到上面一种情况【d-3-1】【插入节点是其父节点的右子节点】
  • I设置为黑色
  • PP设置为红色
  • 对PP节点进行左旋

三、总结

本篇文章主要总结了红黑树插入的四种情况,其中前三种情况都比较好理解,第四种情况比较复杂,需要好好画图才能理解的好一些,附上笔者关于红黑树插入的脑图总结:

 由于笔者水平有限,文中可能存在不对之处,还望大家指正,一起学习,一起进步!

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页
实付 19.90元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值