红黑树原理

AFSim编译一:windows AFSim在windows上的编译 阅读详情

红黑树

与上一篇文章说的AVL树类似,红黑树也是一种可以平衡高度的搜索树,不同点在于红黑树通过控制节点的颜色来调节搜索树的高度。

红黑树的性质

1.每个节点不是红色就是黑色
2.根节点是黑色的
3.不能有连续的红色节点
4.对于每个节点,从该节点到其所有后代叶节点的简单路径上,均包含相同数目的黑色节点。
5.每个叶子节点都是黑色的(这里的叶子节点指的是空节点)
当满足这些性质时,就可以保证红黑树中最长路径高度不超过最短路径的两倍。我们可以想象在红黑树中每条路径黑色节点的数量都是相同的,那么最长路径一定是红黑交替存在的路径,而最短路径一定是全黑的路径,此时最长路径高度为最短路径的两倍。

节点结构

enum Colour
{
// 红黑树颜色
	RED,
	BLACK
};

template<class T>
struct RBTreeNode
{
	RBTreeNode<T>* _parent;//父节点
	RBTreeNode<T>* _left;//左节点
	RBTreeNode<T>* _right;//右节点
	T _data;//数据

	Colour _col;//颜色

	RBTreeNode(const T& data)
		:_parent(nullptr)
		, _left(nullptr)
		, _right(nullptr)
		, _col(RED)
		, _data(data)
	{}
};

插入规则

与上一篇AVL树插入规则相似,先按照搜索树的规则插入,我们每次先将要插入的节点设为红色,当节点插入到合适的位置后,我们检查节点的父节点是否为红色,如果父节点为黑色,那么插入直接成功,如果父节点为红色,则不符合规则三,需要调整颜色。红黑树的调整比AVL树简单很多,我们只需要关注其叔叔节点(父节点的兄弟节点)即可,下面是我列举的各种情况。
我们可以把情况大致分为两种
1.叔叔节点存在且为红色
2.叔叔节点存在且为黑或不存在
本能反应告诉我们第一种状态一定是更均衡的,因为此时父亲和叔叔节点的颜色都为红色,因此对他们的操作也符合我们的本能反应,

  • 对于第一种情况我们要将父节点和叔叔节点的颜色变为黑,并将祖父节点变为红色,并从祖父节点开始继续向上调整
  • 对与第二种情况我们需要对该树进行旋转(旋转可以使树趋向平衡)
    这就是红黑树插入操作最核心的思想,接下来我们来看看插入操作的细节

插入操作实现细节

pair<iterator, bool> Insert(const T& data)
	{
		if (_root == nullptr)
		{
			_root = new Node(data);
			_root->_col = BLACK;
			return make_pair(iterator(_root), true);
		}

		KeyOfT kot;

		Node* parent = nullptr;
		Node* cur = _root;
		while (cur)
		{
			parent = cur;
			if (kot(data) > kot(cur->_data))
			{
				cur = cur->_right;
			}
			else if (kot(data) < kot(cur->_data))
			{
				cur = cur->_left;
			}
			else
			{
				return make_pair(iterator(cur), false);
			}
		}
		cur = new Node(data);
		Node* NewNode = cur;
		cur->_parent = parent;
		if (kot(data) > kot(parent->_data))
		{
			parent->_right = cur;
		}
		else
		{
			parent->_left = cur;
		}

		while (parent && parent->_col == RED)
		{
			Node* grandparent = parent->_parent;
			if (parent == grandparent->_left)
			{
				Node* uncle = grandparent->_right;
				if (uncle && uncle->_col == RED)
				{
					uncle->_col = parent->_col = BLACK;
					grandparent->_col = RED;
					cur = grandparent;
					parent = cur->_parent;
				}
				else // 叔叔存在且为黑或叔叔不存在
				{
					if (cur == parent->_left)
					{
						RotateR(grandparent);
						parent->_col = BLACK;
						grandparent->_col = RED;
					}
					else
					{
						RotateL(parent);
						RotateR(grandparent);
						cur->_col = BLACK;
						grandparent->_col = RED;
					}
					break;
				}
			}
			else
			{
				Node* uncle = grandparent->_left;
				if (uncle && uncle->_col == RED)
				{
					parent->_col = uncle->_col = BLACK;
					grandparent->_col = RED;
					cur = grandparent;
					parent = cur->_parent;
				}
				else
				{
					if (cur == parent->_right)
					{
						RotateL(grandparent);
						parent->_col = BLACK;
						grandparent->_col = RED;
					}
					else
					{
						RotateR(parent);
						RotateL(grandparent);
						cur->_col = BLACK;
						grandparent->_col = RED;
					}
					break;
				}
			}
		}
		_root->_col = BLACK;
		return make_pair(iterator(NewNode), false);
	}
LTE信令流程及业务流程 eNB返回E-RAB建立响应消息,E-RAB建立列表信息中包含成功建立的承载信息,E-RAB建立失败列表消息中包含没有成功建立的承载消息。3)当下行数据达到时,网络侧先对UE进行寻呼,随后UE发起随机接入过程,并发起service request过程。用户面:S-GW向eNB发送承载建立请求,包含(IMSI, QoS, TFT, TEID, LBI等)控制面:MME向eNB发送E-RAB建立请求,包含E-RAB ID,QoS,S-GW TEID。3)在S1接口上建立S1承载,在Uu接口上建立数据无线承载。 阅读详情

相关推荐

Openclaw Onboarding向导全攻略——如何配置你的第一个AI助手

很多新手在成功运行 `openclaw --version` 后,面对黑底白字的终端就陷入了迷茫:“安装好了,然后呢?” 本篇我们就彻底解决这个问题,带你完整走完 `openclaw onboard` 交互式初始化配置向导的每一步,从“安装完成”到“真正能用”,只差这一个向导的距离。 本文为2026年3月最新版,适配OpenClaw v2026.2.x 稳定版,所有步骤均经过实测验证,可直接落地。

夏日清风 1917

红黑树叶子节点为什么是黑null_数据结构与算法(10)红黑树上

1、什么是红黑树上一篇文章中我们学习了什么是平衡二叉树以及它的用法,今天我们将来学习红黑树。红黑树是一种特殊的平衡二叉树,严格来说它不属于平衡二叉树,但是它和平衡二叉树的目的是一样的,都是为了减少查找时的消耗。在许多项目或是数据结构中,红黑树被频繁使用。红黑树的定义和实现都不是一件简单的事情,希望小伙伴们能耐心研究,也希望能指出我的不足之处。我们先来了解一下它的特点:每个节点只有两种颜色...

weixin_39968820的博客 1994

Transformer模型在语义通信中的实战应用:从信源编码到端到端优化

本文深入探讨了Transformer模型在语义通信中的实战应用,从信源编码到端到端优化。文章分析了Transformer凭借其强大的全局依赖建模能力,如何成为实现高效语义提取与传输的理想架构,并提供了构建可端到端训练系统的具体实现思路与评估方法,旨在为下一代智能通信系统提供技术参考。

o9p0q1的博客 691

红黑树(Red-Black tree)

红黑树定义 Red-Black tree, 简称RB-Tree 它是在1972年由鲁道夫·贝尔发明的,他称之为“对称二叉B树”,它现代的名字是在 Leo J. Guibas 和 Robert Sedgewick 于1978年写的一篇论文中获得的 特点:利用对树中的结点 “红黑着色”的要求,降低了平衡性的条件,达到局部平衡,有着良好的最坏情况运行时间,它可以在O(log n)时间内做查找,插入和删除,这里的n是树中元素的数目。 红黑树的应用 典型的用途是:关联数组 C++ STL中的关联式容器:集合set、多

学习日常分享 2490

从流体力学到深度学习:手把手教你用PINN预测涡流场(基于TensorFlow2.10+GPU)

本文详细介绍了如何利用物理信息神经网络(PINN)结合TensorFlow 2.10和GPU加速,预测Navier-Stokes方程的涡流场。通过核心原理讲解、实战环境配置、网络架构设计及物理约束实现,帮助读者掌握从流体力学到深度学习的跨学科技术应用,特别适合处理复杂流体问题和非定常流动场景。

weixin_29048309的博客 212

iOS开发者必备:从越狱设备里提取IPA的三种方法(含Filza、iTools实战)

本文详细介绍了iOS开发者从越狱设备提取IPA文件的三种实用方法,包括使用Filza文件管理器、AFC2配合桌面工具以及命令行高级技术。内容涵盖环境准备、操作步骤和技术原理,帮助开发者高效获取应用包文件,适用于逆向工程、测试分析等场景。

weixin_28717969的博客 818

红黑树

红黑树: 性质! 1、每个节点要么是黑色,要么是红色。(节点非黑即红) 2、根节点是黑色。 3、每个叶子节点(NULL)是黑色(为了简单期间,一般会省略该节点)。 4、如果一个节点是红色的,则它的子节点必须是黑色的。(也就是说父子节点不能同时为红色) 5、从一个节点到该节点的每一个叶子子孙节点的所有路径上包含相同数目的黑节点。(这一点是平衡的关键) 6、新插入节点默认为红色,插入后需...

mist蒙的博客 450

Claude Code 源码一夜流出:会看热闹的人很多,会读源码的人很少

摘要:Claude Code源码意外泄露后,作者分享了高效的源码学习方法:1)Fork仓库保存代码;2)使用Qoder的Repo Wiki功能生成结构化文档和UML图;3)基于Wiki创建可复用的Skill。这种方法比直接让AI总结代码更系统深入,并推荐了可视化学习项目辅助理解。文章强调实践的重要性,提供了具体工具和操作指南。

720

【数据结构】15.红黑树

画图分析红黑树的实现路径,细致的代码讲解

caryon的博客 935

单智能体篇:Prompt工程艺术

模型在接收到 Prompt 时会自动扮演“角色”,角色定义的好坏直接影响智能体输出的风格和专业性。角色定义的重要性让智能体具备明确身份,例如“你是一位专业理财顾问”或“你是一个幽默的文案创作助手”。角色限定了模型知识输出的范围,使回答更专业、更贴合预期。实战示例模糊Prompt给我一些投资建议。你可以投资股票或者基金。优化Prompt你是一位具有10年经验的专业理财顾问,请给我针对30岁男性,年收入20万,风险偏中等的投资组合建议。

公众号:AI前沿侦探 1304

【华为OD机试真题 新系统】1009、企业内部门的最大层级 | 机试真题+思路参考+代码解析(C++、Java、Py、C语言、JS)

【华为OD机试真题 新系统】1009、企业内部门的最大层级 | 机试真题+思路参考+代码解析(C++、Java、Py、C语言、JS) 华为od机试,华为od机试真题,华为od机试E卷,华为odE卷,华为od机试真题E卷,华为OD,华为OD机试,华为OD机试真题,华为od机考,华为od机试D卷,华为od机试真题D卷,华为od手撕代码,华为od,华为od机试C卷,华为od e卷,华为2026e卷,od机试,2026E卷,华为OD机试E卷,什么是华为od,华为od介绍,全面了解华为od,2026华为od,如何备战

KJ.JK 1417

学习红黑树

原文链接http://blog.youkuaiyun.com/lyh__521/article/details/49909953什么是红黑树?     其实,红黑树就是一棵二叉查找树。 掌握红黑树的性质,用处,黑高度,时间复杂度,旋转操作,插入、删除

lwoyvye 1601

116、影像质量主观评价方法论:标准场景与专家判读

本文探讨了影像质量主观评价的方法论,强调标准场景构建和专家判读体系的重要性。作者基于15年行业经验指出,仅靠客观指标无法保证观感质量,提出四类标准场景(灰阶、肤色、纹理、动态)的构建原则和四种专家判读维度(通透性、干净度、自然感、流程化)。文章揭示了主观评价中的常见误区,包括光源单一性、个人判读偏差、显示设备影响等,并建议建立多专家交叉验证机制和主观评价数据库。最后强调主观评价是可标准化的专业技术,需要将人眼感知转化为可追溯的技术参数。

sundong_81的博客 39

红黑树原理详解

   二叉查找树由于在频繁的动态更新过程中,可能会出现树的高度远大于 log2n的情况,所以就会导致各个操作效率下降,最坏的情况下就会退化为链表,变为O(n).很明显,想要解决这个问题,有效的一种办法就是使得树的高度不要差很多,也就是平衡它.     最先发明的平衡二叉查找树是AVL树,(它严格符合平衡二叉查找树的定义,即任何节点的左右子树高度相差不超过 1,是一种高度平衡的二叉查找树。)但是在...

Tattoo的博客 3万+

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

HashMap红黑树原理分析

近期学习了 HashMap 实现原理,这篇咱们了解一下红黑树的设计,相比 jdk1.7 的 HashMap 而言,jdk1.8最重要的就是引入了红黑树的设计,当冲突的链表长度超过 8 个的时候,链表结构就会转为红黑树结构。 01、故事的起因 JDK1.8 最重要的就是引入了红黑树的设计(当冲突的链表长度超过 8 个的时候),为什么要这样设计呢?好处就是避免在最极端的情况下冲突链表变得很长很长,在查询的时候,效率会非常慢。 红黑树查询:其访问性能近似于折半查找,时间复杂度 O(logn); 链表查.

weixin_50236329的博客 4943

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

红黑树的原理

定义 — 是每个节点都带有颜色属性(颜色为红色或黑色)的自平衡二叉查找树,满足下列性质:1)节点是红色或黑色;2)根节点是黑色;3)所有叶子节点都是黑色节点(NULL);4)每个红色节点必须有两个黑色的子节点。(从每个叶子到根的所有路径上不能有两个连续的红色节点。5)从任一节点到其每个叶子的所有简单路径都包含相同数目的黑色节点。

qq_35803412的博客 864

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

C++红黑树的底层原理及其实现原理和实现

今天给大家带来的是红黑树的底层逻辑和底层实现原理及其实现过程,相信大家看完一定会收获满满!~~~

2302_80214413的博客 1225

红黑树的实现原理附手写红黑树

红黑树的实现原理附手写红黑树

热爱C++和golang的学生 1163

红黑树的原理以及建立

R-B Tree,全称是Red-Black Tree,又称为“红黑树”,它一种特殊的二叉查找树。红黑树的每个节点上都有存储位表示节点的颜色,可以是红(Red)或黑(Black)。

2302_76977379的博客 52

红黑树的原理及其简单实现

短期实习比较闲,摸鱼撸个RBT 红黑树原理 首先阐述红黑树(RBT)的原理,RBT在二叉排序树(BST)的基础上又添加了下述的五条约束: 每个节点有颜色属性,要么是红色,要么是黑色。 根节点必为黑色 叶子节点下的空节点视为黑色 红色节点的左右孩子必为黑色节点 从红黑树上的任意一个节点出发到任意一个叶子节点的简单路径上,黑色节点的个数一致。(黑高相同) 需要说明的是,很多博客中会告诉你叶子节点必须是黑色,实际上它指的是颜色是黑色的NIL空节点,本质上就是叶子节点两侧的空节点是黑色,从而方便理解。实现过程中

qq_38069320的博客 321

红黑树的原理及实现

今天分享平衡二叉树的原理及实现: 红黑树的简介: 1、红黑树(R-B Tree,Red-Black Tree)它一种特殊的二叉查找树,同时具备以下特征: 1)节点非红即黑 2)根节点是黑色 3)所有NUll节点称为叶子节点,且认为颜色为黑 4)所有红色节点的子节点都为黑色 5)从任一节点到其叶子节点的所有路径上都包含相同数目的黑节点 以上五点特征共同保证:从根到叶子的最长的路径不多于最短的可能路径的两倍长。 2、红黑树的插入操作: 红黑树性质1:根节点是黑色 红黑树性质5:从任一节

nandao158的博客 1781

红黑树原理解析以及Java实现

红黑树本文的主要内容: 1、红黑树的基本概念以及最重要的5点规则。 2、红黑树的左旋转、右旋转、重新着色的原理与Java实现; 3、红黑树的增加结点、删除结点过程解析;1.红黑树的基本概念与数据结构表示首先红黑树来个定义: 红黑树定义:红黑树又称红-黑二叉树,它首先是一颗二叉树,它具体二叉树所有的特性。同时红黑树更是一颗自平衡的排序二叉树(平衡二叉树的一种实现方式)。 我们知道一颗基本的二

惜暮 2万+

快速理解红黑树原理

红黑树 红黑树 其实就是一个二叉树。 常用的二叉树类型 简单说二叉树概念: 二叉树 又称度为至多二的树。 平衡二叉树 平衡二叉树又称 AVL 树 特点:一个根节点的左右个子树的高度差不超过1 平衡二叉树 非平衡二叉树 高度差已经大于1 了。 平衡树解决的问题就是 能够最大限度的增加访问的每个节点的的平均性 。保证每个节点被访问的次数平衡。 完全二叉树

jjc120074203的博客 4万+
上一篇: 模拟实现AVL树插入操作
下一篇: map&set的封装
JayceSun449
博客等级 码龄5年 554粉丝 49原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

JayceSun449

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

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

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

打赏作者

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

抵扣说明:

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

余额充值