【数据结构】红黑树

目录

前言

一、红黑树概念

二、红黑树的性质

三、红黑树节点定义

四、红黑树的插入

[1. 按照二叉搜索树的规则插入新节点](#1. 按照二叉搜索树的规则插入新节点)

[2. 根据红黑树的性质调整树](#2. 根据红黑树的性质调整树)​​​​​​​

附录:红黑树实现参考代码​​​​​​​


前言

AVL树虽然解决了有序数列插入时二叉树退化的问题,但因AVL树的高度差要求严格导致数据变动时树的旋转频繁,一定程度上降低了运行效率。

为了降低运行效率降低程度,就有了红黑树。


一、红黑树概念

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

二、红黑树的性质

红黑树满足以下性质:

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

三、红黑树节点定义

复制代码
enum Color
{
	RED,
	BLACK
};

template<class K, class V>
struct RBTreeNode
{
	RBTreeNode<K, V>* _parent;
	RBTreeNode<K, V>* _left;
	RBTreeNode<K, V>* _right;
	std::pair<K, V> _kv;
	Color _color;

	RBTreeNode(const std::pair<K, V>& kv = std::pair<K, V>(), Color color = RED)
		:_parent(nullptr)
		,_left(nullptr)
		,_right(nullptr)
		,_kv(kv)
		,_color(color)
	{}
};

四、红黑树的插入

红黑树是在二叉搜索树的基础上加上其平衡限制条件,因此红黑树的插入可分为两步:

1. 按照二叉搜索树的规则插入新节点

2. 根据红黑树的性质调整树

因为新节点的默认颜色是红色,因此:如果其双亲节点的颜色是黑色,没有违反红黑树任何性质,则不需要调整;但当新插入节点的双亲节点颜色为红色时,就违反了性质三不能有连在一起的红色节点,此时需要对红黑树分情况来讨论:

约定:cur为当前节点,p为父节点,g为祖父节点,u为叔叔节点

  • cur为红,p为红,g为黑,u存在且为红

直接将p、u节点变黑,g节点变红即可。

如果g的parent为红,则需要继续向上调整。

  • cur为红,p为红,g为黑,u不存在/u存在且为黑

p为g的左孩子,cur为p的左孩子,则进行右单旋转;

相反, p为g的右孩子,cur为p的右孩子,则进行左单旋转

p、g变色--p变黑,g变红

  • cur为红,p为红,g为黑,u不存在/u存在且为黑

p为g的左孩子,cur为p的右孩子,则针对p做左单旋转;

相反, p为g的右孩子,cur为p的左孩子,则针对p做右单旋转

转换成了情况2

附录:红黑树实现参考代码

RBTree · 梁羽赫/cpp_advanced - 码云 - 开源中国 (gitee.com)https://gitee.com/yuhe-liang/cpp_advanced/tree/master/RBTree

相关推荐
张张努力变强2 小时前
C++ STL string 类:常用接口 + auto + 范围 for全攻略,字符串操作效率拉满
开发语言·数据结构·c++·算法·stl
wWYy.2 小时前
数组快排 链表归并
数据结构·链表
李斯啦果3 小时前
【PTA】L1-019 谁先倒
数据结构·算法
Mr Xu_18 小时前
告别硬编码:前端项目中配置驱动的实战优化指南
前端·javascript·数据结构
czxyvX18 小时前
017-AVL树(C++实现)
开发语言·数据结构·c++
数智工坊18 小时前
【数据结构-队列】3.2 队列的顺序-链式实现-双端队列
数据结构
elseif12319 小时前
【C++】并查集&家谱树
开发语言·数据结构·c++·算法·图论
徐小夕@趣谈前端19 小时前
Web文档的“Office时刻“:jitword共建版2.0发布!让浏览器变成本地生产力
前端·数据结构·vue.js·算法·开源·编辑器·es6
Nebula_g20 小时前
线程进阶: 无人机自动防空平台开发教程(更新)
java·开发语言·数据结构·学习·算法·无人机
xuxie9921 小时前
day 23 树
数据结构