数据结构~红黑树(特性、查找、插入、删除)

前言

红黑树是一个查找效率和构建效率都比较优秀的一种数据结构。
比如java8中的hashmap在扩容的时候,如果table长度达到64,并且链表长度达到8就会对其进行转红黑树的操作。

每次插入新的数据的时候,会变色和旋转,来让高度保持在log2(N)这个合理高度内

概念

首先要知道,红黑树是一种特殊的二叉树!

形状和AVL树很像,但是AVL树是有平衡因子进行强制平衡,而红黑树是由自己的一些特点包括变色和左旋右旋来实现平衡。

规则

(1)每个节点或者是黑色,或者是红色。并且每次新插入的节点都是红色。

(2)根节点是黑色。

(3)每个叶子节点(NUIL)是黑色。 [注意:这里叶子节点,是指为空的叶子节点!]

(4)如果一个节点是红色的,则它的子节点必须是黑色的,也就是说不可能出现两个连续的红色节点,不过两个连续的黑色节点是可能出现的

(5)从任意一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。

查询

红黑树的查询和普通的二叉搜索树查询是一样的,当我想查某个数的时候,只需要把这个数从根节点比较,如果比根节点大,那就继续比较根节点的右节点,否则就是根节点的左节点,以此类推。

插入

学习怎么构建红黑树之前,我们必须掌握几个基本的知识!

1、红黑树在插入数据的时候,会先遍历数据应该插入到哪个位置,插入的位置肯定在底部,不可能在中间突然插入一个值。

2、插入的数据一定是红色的(因为要遵守红黑树的第五条规则,如果有一条分支增加了一个黑色节点,就会打破该规则)

3、插入之后,为了满足规则4,就需要用到换色与左旋、右旋的操作了

换色,其实就是红变黑,黑变红,只需要让某个对象的属性改变就可以了,没什么好说的。

旋转分两种

左旋
原始的样子:

在这里插入图片描述
正在变换:
在这里插入图片描述
变换结束:
在这里插入图片描述
右旋
原始的样子:
在这里插入图片描述
正在变换:
在这里插入图片描述
变换结束:
在这里插入图片描述
所以,我们发现左旋和右旋是一个相对的操作。
把变色和左旋,右旋全部了解了之后,我们就依据实际情况来看看红黑树到底是如何或者说在什么情况下要进行变色和旋转。

实际插入情况分析

大致会有四种情况:

情况1:如果是根节点,直接插入就完事了(插入还是固定为红色,然后在代码的最后把根目录设置为黑色)

情况2:插入节点的父亲,为黑色,也一样,插入就完事了,不用做任何的改动

情况3:插入节点的父亲为红色,叔叔节点(插入节点的爷爷的另一个子节点)的颜色也是红色

情况4:插入节点的父亲为红色,叔叔节点节点为黑色(这种情况最麻烦,因为需要再做一次判断)

对于不同情况的处理

情况1:这棵树没有任何节点,插入的点为根节点,一开始插入红色,然后直接转为黑色

情况2:父节点是黑色,直接插入,不做任何的换色和旋转

情况3:父节点是红色,且叔叔节点也是红色,直接把叔叔和爸爸变成黑色,然后把爷爷变成和自己一样的红色,继续迭代(因为这样可能会出现爷爷和太爷爷的都是红色的情况,那么就要继续判断是哪种情况)

比如假设新插入的为M, 父亲为F, 叔叔为U,爷爷为G
在这里插入图片描述
情况4:父节点是红色,叔叔节点是黑色,这个就比较复杂,又分为几种状况(为了区分逻辑,分为情况和状况)。

状况1:如果此时新来的节点是父亲的右孩子

这里的做法就是将状况1转换成状况2,就要用到旋转,就是以其父亲节点了核心进行左旋。

比如下面新插入的是21元素
在这里插入图片描述
状况2:如果此时新来的节点是父亲的左孩子

上述状况1的作用就是将其转为状况2,所以情况4的解决核心还在状况2上解决

解决思路就是直接将新来节点的父节点染黑,祖父节点染红,然后以祖父节点为核心进行左旋

如下图
在这里插入图片描述

删除操作(寻找继承人)

插入节点分为两步,第一步是通过key的大小,来判断插入数据应该加入到哪个位置;第二步就是平衡红黑树

删除节点也分为两步,第一步的通过key找到要删除的节点,然后寻找该节点的继承人,然后删除继承人,第二步就是平衡红黑树。

总共会遇到3种情况!(以下均用p来代表要删除的那个节点)

会遇到的情况

情况1:p节点一个子节点也没有

情况2:p节点有且仅有一个子节点

情况3:p节点两个子节点都有

对于不同情况的处理

情况1:直接删除该节点

情况2:直接将该节点的唯一的子节点接到该节点的父节点上 ,删除该节点

情况3:找一个继承节点(因为寻找继承节点的方式导致了继承节点一定是情况1或者情况2),把继承节点的值写入p节点,根据情况1或者情况2来处理继承节点。就是找一个替罪羊哈哈哈,交换数据,最后删除替罪羊,和二叉搜索树的删除 一样。

猜你喜欢

转载自blog.csdn.net/Shangxingya/article/details/115047196