红黑树原理(插入+删除过程分析)

引言
红黑树的原理经常在面试中被问到,因此根据浏览的一些博客进行了归纳总结。
参考如下:添加链接描述添加链接描述添加链接描述
红黑树原理

  1. 为什么会有树这种结构
    最初的数据结构是从线性表开始,而线性表的逻辑结构属于一对一的关系;而对于一对多的数据逻辑关系就需要利用树结构来解决。
  2. 红黑树结构提出的意义
    红黑树是一种非线性的数据结构,其设计目的是为了高效地进行增删改查。
    (1) 二叉查找树
    a) 二叉查找树的特点:
    左子树上所有结点的值均小于或等于它的根结点的值;右子树上所有结点的值均大于或等于它的根结点的值。
    在这里插入图片描述

b) 二叉查找树的删除过程
按照待删除节点的位置,分为以下四种情况:

  1. 要删除的节点没有左右孩子
    直接删除

  2. 要删除的节点只有左孩子
    如果要删除的节点只有左孩子,那么就让该节点的父亲结点指向该节点的左孩子,然后删除该节点。
    在这里插入图片描述

  3. 要删除的节点只有右孩子
    如果要删除的节点只有右孩子,那么就让该节点的父亲结点指向该节点的右孩子,然后删除该节点。
    在这里插入图片描述

对于上面这两种情况我们还应该在之前进行一个判断,就是判断这个节点是否是根节点,如果是根节点的话,就直接让根节点指向这个节点的左孩子或右孩子,然后删除这个节点。
4) 要删除的节点有左右孩子
 找到该节点的右子树中的最左孩子
 将此左孩子的值和待删除的节点的值进行交换
 删除此节点
在这里插入图片描述

c) 二叉查找树的查找过程:
先与根节点比较,比根节点大则从右子树查找,比根节点小则从左子树查找,然后重复上述过程,直到找到目标元素或到叶子结点(没有子结点)后仍未找到,则停止。
d) 二叉查找树的缺点:
若以9为根节点,然后依次插入13、15、17、19。会发生如下情况:
二叉查找树失去平衡,查找效率降低。因此,未解决此问题,提出了平衡二叉树的概念。
在这里插入图片描述

(2) 平衡二叉树(AVL树)
a) 平衡二叉树的特点:
从任何一个节点出发,左右子树深度之差的绝对值不超过1;左右子树仍然为平衡二叉树。
在这里插入图片描述

b) 平衡二叉树的自平衡调整:
在平衡二叉树中插入一个元素4,此时平衡二叉树将自动进行平衡调整,即:
在这里插入图片描述

由于插入了4之后破坏了平衡,因此进行平衡纠正,即:
在这里插入图片描述

c) 平衡二叉树的优点:
平衡二叉树在插入时最多只需要两次旋转就会重新恢复平衡;
查找时既有着二叉查找树的优越性,在插入时还能通过调整继续保持平衡特性
d) 平衡二叉树的缺点:
删除:平衡二叉树最坏情况下需要维护被删除节点到根节点路径上所有节点的 ,旋转的量级是O(logN);但红黑树只需要旋转三次即可重新平衡,旋转的量级是O(1)。
保持平衡:平衡二叉树高度平衡,因此在大量插入和删除节点的场景下,平衡二叉树为了保持平衡需要调整的频率会更高。
e) 选用条件:
在大量查找情况下,平衡二叉树效率更高;
在大量增删的情况下,红黑树是首选
(3) 红黑树(RBT树)
a) 结构特点:
每个节点都是红色或者黑色;
树的根始终是黑色的;
没有两个相邻的红色节点;
从节点到其任何后代NULL节点(叶子结点下方的两个空节点,默认为黑色)的每条路径都具有相同数量的黑色节点;
在这里插入图片描述

b) 红黑树的两大操作:
 recolor(重新标记黑色或红色)
 rotation(旋转,使得树保持平衡)
c) 红黑树的插入操作
设插入的节点为X

  1. 将新插入的节点标记为红色
  2. 如果X是根节点(root),则标记为黑色
  3. 如果X的parent不是黑色,同时X也不是root
    3.1 如果X的uncle是红色
    3.1.1 将parent和uncle标记为黑色
    3.1.2 将grand parent标记为红色
    3.1.3 让X节点的颜色与X祖父的颜色相同,然后重复步骤2、3
    如下:
    在这里插入图片描述

插入步骤如下:
a) 将新插入的X节点标记为红色
b) 发现X的parent为红色,且X的uncle为红色
c) 将P和U标记为黑色
d) 将X及其grand parent标记为相同颜色(红色),重复步骤2、3
e) 判断grand parent是否为根节点,为根节点则标记为黑色
f) 结束插入
3.2 如果X的uncle是黑色,则分为四种情况进行处理
3.2.1 左左(P是G的左孩子,X是P的左孩子)
在这里插入图片描述

3.2.2 左右(P是G的左孩子,X是P的右孩子)
在这里插入图片描述

3.2.3 右右(P是G的右孩子,X是P的右孩子)
在这里插入图片描述

3.2.4 右左(P是G的右孩子,X是P的左孩子)
在这里插入图片描述

总结:在插入过程中,若节点值位置发生变化,则需要重新根据插入原则判断是否影响了红黑树的特性,并根据插入后的步骤进行变换。
在这里插入图片描述

d) 红黑树的删除操作
叶子节点:节点后无子节点
后继节点:比其大的节点中的最小值(节点右子树中的最小值)

  1. 删除节点为红色节点
    1.1 删除红色的叶子节点
    直接删除。
    1.2 删除红色的非叶子节点
    需要找到被删除节点的直接后继,用它的值取代被删除节点的值,然后按情况1删除。
  2. 删除节点为黑色节点
    2.1 删除黑色的叶子节点
    2.1.1 待删除节点D的兄弟节点S为红色
    ①D为左节点
    在这里插入图片描述

将父亲节点和兄弟节点的颜色互换,也就是p变成红色,S变成黑色,然后将P树进行AVL树种的RR型操作,结果如下图:
在这里插入图片描述

此时D的兄弟节点变为黑色,变成后续2.1.4讨论 。
即:将父亲节点P改成黑色,将兄弟节点S改成红色,然后删除D即可。
②D为右节点
在这里插入图片描述

将P和S的颜色互换,也就是将P变成红色,将S变成黑色,然后对P进行类似AVL树的LL操作。结果如下图:
在这里插入图片描述

此时D的兄弟节点变为黑色,变成后续2.1.4讨论 。
即:将父亲节点P改成黑色,将兄弟节点S改成红色,然后删除D即可。
2.1.2 待删除节点D的兄弟节点S为黑色,且远侄子节点为红色
① D为左孩子时,其远侄子为S的右孩子
在这里插入图片描述

没有上色的节点表示黑色红色均可,注意如果SL为黑色,则SL必为NULL节点。
将P和S的颜色对调,然后对P树进行类似AVL树RR型的操作,最后把SR节点变成黑色,并删除D即可。
在这里插入图片描述

② D为右孩子时,其远侄子为S的左孩子
在这里插入图片描述

同样,将P和S的颜色对调,然后再对P树进行类似AVL树LL型的操作,最后将SR变成黑色,并删掉D即可。结果如下图:
在这里插入图片描述

2.1.3 待删除节点D的兄弟节点S为黑色,且近侄子节点为红色
① D为左孩子时,其近侄子为S的左孩子
在这里插入图片描述

将SL右旋,并将S和SL的颜色互换,得到:
在这里插入图片描述

对SL进行LL变换,将P的颜色变为与S相同,删掉D节点即可。
② D为右孩子时,其近侄子为S的右孩子
在这里插入图片描述

将S和SR颜色对调,然后对SR进行左旋操作,结果如下图:
在这里插入图片描述

对SL进行RR变换,将P的颜色变为与S相同,删掉D节点即可。
2.1.4 父亲节点P为红色,兄弟节点和兄弟节点的两个孩子(只能是NULL节点)都为黑色情况。
在这里插入图片描述

将父亲节点P改成黑色,将兄弟节点S改成红色,然后删除D即可。如下图:
在这里插入图片描述

2.1.5 父亲节点P,兄弟节点和兄弟节点的两个孩子(只能是NULL节点)都为黑色情况。
在这里插入图片描述

将兄弟节点S的颜色改成红色,这样删除D后P的左右两支的黑节点数就相等了,但是经过P的路径上的黑色节点数会少1,这个时候,再以P为起始点,继续根据情况进行平衡操作结果如下图:

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值