【C++详解】——红黑树

红黑树是一种自平衡二叉搜索树,保证最长路径不超过最短路径两倍。插入节点时,默认插入红色节点以避免立即破坏性质。插入后可能需通过颜色调整或旋转来保持平衡。红黑树较AVL树在增删频繁场景下性能更优,实现更简单。

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

目录

红黑树的概念 

红黑树的性质 

红黑树节点的定义 

红黑树的结构 

红黑树的插入操作 

情况一 

情况二 

情况三 

红黑树的验证 

 红黑树的查找 

红黑树与AVL树的比较 


红黑树的概念

红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。

通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路
径会比其他路径长出俩倍,因而是接近平衡的。

 

红黑树的性质 

红黑树为了保证其最长路径中节点个数不会超过最短路径节点个数的两倍,具有以下性质:

  1. 每个结点不是红色就是黑色
  2. 根节点是黑色
  3. 如果一个节点是红色的,则它的两个孩子结点是黑色
  4. 对于每个结点,从该结点到其所有后代叶结点的简单路径上,均包含相同数目的黑色结点
  5. 每个叶子结点都是黑色的(此处的叶子结点指的是空结点)

根据红黑树的性质3可以得出,红黑树当中不会出现连续的红色结点,而根据性质4又可以得出,从某一结点到其后代叶子结点的所有路径上包含的黑色结点的数目是相同的。

我们假设在红黑树中,从根到叶子的所有路径上包含的黑色结点的个数都是N个,那么最短路径就是全部由黑色节点构成的路径,即长度为N。 

而最长可能路径就是由一黑一红结点构成的路径,该路径当中黑色结点与红色结点的数目相同,即长度为2N。 

 因此,红黑树从根到叶子的最长可能路径不会超过最短可能路径的两倍。

红黑树节点的定义 

template<class K, class V>
struct RBTreeNode
{
	//三叉链
    //方便旋转操作
	RBTreeNode<K, V>* _left;
	RBTreeNode<K, V>* _right;
	RBTreeNode<K, V>* _parent;

	//存储的键值对
	pair<K, V> _kv;

	//结点的颜色
	int _col; //红/黑

	//构造函数
	RBTreeNode(const pair<K, V>& kv)
		:_left(nullptr)
		, _right(nullptr)
		, _parent(nullptr)
		, _kv(kv)
		, _col(RED)
	{}
};

对于节点的颜色,因为只有红和黑两种颜色,bool值表示比较简单,但这里我使用枚举定义颜色,可以增加代码的可读性和可维护性,并且便于后序的调试操作。

//枚举定义结点的颜色
enum Colour
{
	RED,
	BLACK
};

 【思考】在节点的定义中,为什么要将节点的默认颜色给成红色的?

当我们向红黑树插入结点时,若我们插入的是黑色结点,那么插入路径上黑色结点的数目就比其他路径上黑色结点的数目多了一个,即破坏了红黑树的性质4,此时我们就需要对红黑树进行调整。

若我们插入红黑树的结点是红色的,此时如果其父结点也是红色的,那么表明出现了连续的红色结点,即破坏了红黑树的性质3,此时我们需要对红黑树进行调整;但如果其

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hrimkn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值