c++——红黑树

本文介绍了红黑树的基本概念、特性及插入操作的实现细节。红黑树是一种自平衡的二叉搜索树,保证了任何路径不会超过其他路径的两倍长。在插入节点后,通过特定的调整策略如颜色转换和旋转操作来保持红黑树的性质。文中详细阐述了四种插入后的情况及其对应的调整方法。
摘要由CSDN通过智能技术生成

一、红黑树的概念
红黑树是一种二叉搜索树,但是每个结点都有表示结点的颜色,可以是Red或Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出2倍,因而是接近平衡的二叉搜索树。

二、红黑树的特性

1、每个节点要么是黑色,要么是红色。
2、根节点是黑色。
3、每个叶子节点(NIL)是黑色。
4、每个红色结点的两个子结点一定都是黑色。
5、任意一结点到每个叶子结点的路径都包含数量相同的黑结点。

三、红黑树的实现
1、红黑树的插入
(1)根节点为空,则直接插入节点,并将其颜色设为黑色。
(2)根节点不为空,则插入节点后,还要对其进行判断是否满足红黑树的特性,如果不满足,还需要对红黑树进行调整,让其能够满足红黑树特性。
注:一般来说,都默认插入的节点为红色

那么该如何进行调整呢?
情况一:: cur为红,p为红,g为黑,u存在且为红
在这里插入图片描述
其中cur为插入的节点,parent为它的父节点,uncle为它的叔叔节点,gparent为它的祖父节点。该树不一定是一棵完整的树,有可能只是一棵子树。

解决方式:将p,u改为黑,g改为红,然后把g当成cur,继续向上调整。
在这里插入图片描述
情况二: cur为红,p为红,g为黑,u不存在/u为黑
1、p为g的左孩子,cur为p的左孩子,则进行右单旋转。
u不存在
在这里插入图片描述
u存在且为黑
在这里插入图片描述

2、p为g的右孩子,cur为p的右孩子,则进行左单旋转。
u不存在
在这里插入图片描述
u存在且为黑
在这里插入图片描述

情况三:cur为红,p为红,g为黑,u不存在/u为黑
1、p为g的左孩子,cur为p的右孩子,则针对p做左单旋转
u不存在
在这里插入图片描述
u存在且为黑
在这里插入图片描述
2、p为g的右孩子,cur为p的左孩子,则针对p做右单旋转
u不存在
在这里插入图片描述
u存在且为黑
在这里插入图片描述
由此可以看出,对于情况三来说,都可以转换为情况二来进行处理。

左旋
在这里插入图片描述
右旋
在这里插入图片描述
代码实现:

enum Color{
   
	RED,
	BLACK
};
//红黑树节点
template<class T>
struct RBTreeNode
{
   
	RBTreeNode(const T& data = T(), Color color = RED)
	: _left(nullptr)
	, _right(nullptr)
	, _parent(nullptr)
	, _data(data)
	, _color(color)
	{
   }

	RBT
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值