图解红黑树插入

本文详细解析红黑树的插入规则,通过实例展示了不同情况下插入新节点如何保持红黑树平衡,包括颜色调整和旋转操作,确保满足红黑树的性质。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

红黑树是一棵平衡二叉查找树,它确保没有一条路径会比其它路径长出两倍,因此接近平衡树。

红黑树的几条规则:
1)各节点非黑即红
2)根节点是黑色的
3)每个叶节点(NIL哨兵节点)是黑色的
4)红节点的左右子节点必须是黑色
5)对每个节点,从该节点到其子孙节点的所有路径上包含相同数量的黑节点
6)黑节点的左右子节点没有颜色要求

下图为一棵红黑树:
在这里插入图片描述

在进行红黑树数据插入之前,我们先来看看下图两种结构:
在这里插入图片描述
当我们在图(1)中给右节点插入一个孩子节点时(为确保满足规则5,我们新插入的节点都设为红色),不满足红色节点的孩子必须为黑的规则(规则4),此时若该新节点叔叔(双亲的双亲的左孩子)也为红色时,则将该节点的爸爸和该节点的叔叔都变为黑色,将爷爷变为红色,此时又满足了红黑树的规则。

接下来详细讲解红黑树的插入过程
下文图示统一省去了NIL节点。
首先我们先构建如下图的一个简单红黑树(此过程十分简单,在此省略):
在这里插入图片描述
1)插入数据78
在这里插入图片描述
如左图,插入78时,与前文所讲的情况相同,违背了规则4,此时判断78的叔叔(23)为红色,则将其爸爸和叔叔变为黑色,将其爷爷变为红色,由于爷爷此时为根节点,所以最终变为黑色。

2)插入90
在这里插入图片描述
如左图,插入90时,不满足规则4,此时其叔叔节点指向哨兵节点(NIL),即不为红色,则仅仅通过改变父辈颜色无法满足规则5,因为是在爷爷的右边的右边插入的数据,此时将该新节点的爸爸(78)设为黑色,将其爷爷(56)设为红色,则以爷爷为基点进行左旋转,重新达到红黑树要求。(先改变颜色后旋转是为代码实现步骤更简单,自行理解时可先旋转后根据规则考虑颜色)

3)插入99,95
在这里插入图片描述
插入99的情况同(1),不再说明。插入95时,不满足规则4,其叔叔不为红色,由于是在其爷爷的右边的左边插入数据,则将该节点置为黑色,将其爷爷置为红色,以爸爸(99)为基点先进行右旋,再以爷爷(90)为基点进行左旋,然后再按规则进行判断是否满足红黑树条件。

4)插入110
在这里插入图片描述
插入110时,不满足规则4,其叔叔为红色,则将其爸爸和叔叔设为黑色,将其爷爷设为红色,变成图(2)结果,此时仍不满足规则4,由于95的叔叔为黑色,并且95是其爷爷的右孩子的右孩子,所以将95的爸爸设为黑色,将其爷爷设为红色,并以爷爷(34)为基点进行左旋。

左右插入互为镜像,只是左右旋转方向相反,在此不进行左边数据插入的图解。

规则总结如下:
1、如果插入的节点,其父节点和其叔叔节点都为【红色】,则需将父节点和叔叔节点改为【黑色】,将爷爷节点改为【红色】(若爷爷节点为根节点,则仍为【黑色】)(如例1,插入数据78)
2、如果插入的节点,其父节点为【红色】,叔叔节点为【黑色】,父节点是爷爷节点的右孩子时:
(1)插入的节点为父节点的右孩子,将其父节点设为【黑色】,其爷爷节点设为【红色】,并对其爷爷节点进行左旋;(如例2,插入90)
(2)插入的节点为父节点的左孩子,将其自身设为【黑色】,将其爷爷节点设为【红色】,先对父节点进行右旋,再对爷爷节点进行左旋。(如例3,插入95)
3、如果插入的节点,其父节点时【红色】,叔叔节点是【黑色】,父节点是爷爷节点的左孩子时:
(1)插入的节点为父节点的左孩子,将其父节点设为【黑色】,爷爷节点设为【红色】,并对爷爷节点进行右旋;
(2)插入的节点为父节点的右孩子,将其自身设为【黑色】,将其爷爷节点设为【红色】,先对父节点进行左旋,在对爷爷节点进行右旋。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值