RBTree模拟实现

news2025/1/12 6:49:58

一、概念

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

性质

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

问题:

如何做到最长路径<=2*最短路径?

不能连续红色+root为黑+每条路径黑结点数相同。

AVL和RBT性能对比:搜索->io

搜索/查找时:同一量级

插入/删除:

AVL树,插入删除时,因为要控制严格平衡,会进行大量旋转操作。        

二、结点的定义

三、Insert

寻找插入位置

先查找要插入的位置,_root根节点颜色默认为BLACK。

插入新结点的颜色为RED。

这是为了满足性质4,如果新结点为BLACK,会影响所有路径,相当于其它路径的黑结点数都距离目标个数缺少1个。

新结点为RED,只用满足性质3不是连续红结点即可。

则只需调整其祖先结点,并关注uncle结点颜色即可。

1、uncle存在且为红

2、uncle不存在

3、uncle存在且为黑

4、代码实现

	bool Insert(const pair<K, V>& kv)
	{
		if (_root == nullptr)
		{
			_root = new Node(kv);
			_root->_col = BLACK;
			return true;
		}

		Node* parent = nullptr;
		Node* cur = _root;
		while (cur)
		{
			if (kv.first > cur->_kv.first)
			{
				parent = cur;
				cur = cur->_right;
			}
			else if (kv.first < cur->_kv.first)
			{
				parent = cur;
				cur = cur->_left;
			}
			else return false;
		}

		cur = new Node(kv);
		cur->_col = RED; 
		if (kv.first > parent->_kv.first)
		{
			parent->_right = cur;
		}
		else
		{
			parent->_left = cur;
		}
		//每次新增newnode,要初始化它的_parent指针  三叉链
		cur->_parent = parent;

		//parent为红才需要调整
		while (parent && parent->_col == RED)
		{
			Node* ppnode = parent->_parent;
			//1、uncle存在且为红
			//2、uncle不存在
			//3、uncle存在且为黑
			if (parent == ppnode->_left)
			{
				Node* uncle = ppnode->_right;
				if (uncle && uncle->_col == RED)
				{
					parent->_col = uncle->_col = BLACK;
					ppnode->_col = RED;
					//继续向上调整
					cur = ppnode;
					parent = cur->_parent;//没有父亲则cur为根,直接变黑即可
				}
				else if (uncle == nullptr || (uncle && uncle->_col == BLACK))
				{
					//uncle不变色,2种情况可以合成一种
					if (cur == parent->_left)
					{
						//     pp
						//   p 	  
						//c
						RotateR(ppnode);
						parent->_col = BLACK;
						ppnode->_col = RED;
					}
					else
					{
						//     pp
						//   p 	  
						//		c
						RotateL(parent);
						RotateR(ppnode);
						cur->_col = BLACK;
						ppnode->_col = RED;
					}
					break;//只要旋转完就break
				}	
			}
			else
			{
				Node* uncle = ppnode->_left;
				if (uncle && uncle->_col == RED)
				{
					parent->_col = uncle->_col = BLACK;
					ppnode->_col = RED;
					//继续向上调整
					cur = ppnode;
					parent = cur->_parent;//没有父亲则cur为根,直接变黑即可
				}
				else if (uncle == nullptr || uncle && uncle->_col == BLACK)
				{
					//uncle不变色,2种情况可以合成一种
					if (cur == parent->_right)
					{
						//     pp
						//   u    p 	  
						//			c
						RotateL(ppnode);
						ppnode->_col = RED;
						parent->_col = BLACK;
					}
					else
					{
						//     pp
						//   u	  p 	  
						//		c
						RotateR(parent);
						RotateL(ppnode);
						cur->_col = BLACK;
						ppnode->_col = RED;
					}
					break;//只要旋转完就break
				}
			}
		}

		_root->_col = BLACK;
		return true;
	}

四、IsBalance检验是否平衡

必须在满足是红黑树的条件下,检验其所有性质。

1、若简单的计算最长路径和最短路径,可能会出现连续RED的情况,不满足。

2、遍历所有路径,统计每条路径黑结点的个数,看是否都相同,遍历过程可以检查是否存在连续RED结点。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/999072.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C#实战】控制台游戏 勇士斗恶龙(3)——营救公主以及结束界面

君兮_的个人主页 即使走的再远&#xff0c;也勿忘启程时的初心 C/C 游戏开发 Hello,米娜桑们&#xff0c;这里是君兮_&#xff0c;最近开始正式的步入学习游戏开发的正轨&#xff0c;想要通过写博客的方式来分享自己学到的知识和经验&#xff0c;这就是开设本专栏的目的。希望…

pod 创建自定义库失败后解决方案

遇到以上问题&#xff1a; Cloning https://github.com/CocoaPods/pod-template.git into GlobalButton. Configuring GlobalButton template. Ignoring ffi-1.15.5 because its extensions are not built. Try: gem pristine ffi --version 1.15.5 /Library/Ruby/Site/2.6…

【校招VIP】前端计算机网络之webSocket相关

考点介绍 WebSocket 是一种网络通信协议&#xff0c;很多高级功能都需要它。初次接触 WebSocket 的人&#xff0c;都会问同样的问题&#xff1a;我们已经有了 HTTP 协议&#xff0c;为什么还需要另一个协议&#xff1f;它能带来什么好处&#xff1f; 答案很简单&#xff0c;因为…

Codesys可以和西门子博途平分秋色吗?

当今工业自动化界&#xff0c;西门子博途似乎一直是硬件和软件开发的标配。但近年来&#xff0c;有一个名字越来越频繁地出现在各大PLC厂家的产品中&#xff1a;Codesys。此软件是否真的如传说中那样优秀&#xff1f;Codesys与西门子博途之间的竞争究竟如何呢&#xff1f;接下来…

电脑(win10系统) 每次开机都进入备份系统

解决方法&#xff0c;在系统设置里面将win10设置为默认的开机项。 1、winr 打开cmd&#xff0c;输入msconfig&#xff0c;打开系统配置--引导---选择win10系统----设为默认值----确定 2、点击电脑&#xff0c;右击属性&#xff0c;打开设置---高级系统设置-----高级 ------启动…

Swift 周报 第三十七期

文章目录 前言新闻和社区苹果跌近 3% 市值两天蒸发 1898 亿 美元iPhone 15 系列订单量下滑&#xff0c;苹果公司面临双重市场冲击苹果的对手回来了 提案通过的提案正在审查的提案驳回的提案 Swift论坛推荐博文话题讨论关于我们 前言 本期是 Swift 编辑组整理周报的第三十七期&…

RTSP流媒体服务器EasyNVR安防视频云服务平台如何手动配置Onvif探测功能?

安防监控系统EasyNVR视频云存储平台可实现设备接入、实时直播、录像、检索与回放、视频云存储、视频分发等视频能力服务&#xff0c;可覆盖全终端平台&#xff08;pc、手机、平板等终端&#xff09;&#xff0c;在智慧工厂、智慧工地、智慧社区、智慧校园等场景中有大量落地应用…

安装vCenter6.7出错 DNS服务原因

https://blog.csdn.net/seaship/article/details/107045006**&#xff21;.VCSA6.7的安装**第1步&#xff0c;运行VCSA 6.7部署程序&#xff0c;中间一些截图参考何老师相关部署文章即可第2步&#xff0c;配置VCSA虚拟机网络&#xff0c;FQDN填写虚拟机分配的IP地址&#xff0c…

二分查找实例3(寻找旋转排序数组中的最小值)

题目&#xff1a; 已知一个长度为 n 的数组&#xff0c;预先按照升序排列&#xff0c;经由 1 到 n 次 旋转 后&#xff0c;得到输入数组。例如&#xff0c;原数组 nums [0,1,2,4,5,6,7] 在变化后可能得到&#xff1a; 若旋转 4 次&#xff0c;则可以得到 [4,5,6,7,0,1,2]若旋…

《论文阅读》常识感知的提示用于可控的同情对话生成 2023 AAAI

《论文阅读》常识感知的提示用于可控的同情对话生成 前言简介基础知识即插即用(Plug and Play)Future Discriminators(FUDGE)动机数据集方法前言 你是否也对于理解论文存在困惑? 你是否也像我之前搜索论文解读,得到只是中文翻译的解读后感到失望? 小白如何从零读懂论…

C#+sqlserver+asp.net婚纱影楼管理系统

一、源码描述 这是一款简洁十分美观的ASP.NETsqlserver源码&#xff0c;界面十分美观&#xff0c;功能也比较全面&#xff0c;比较适合 作为毕业设计、课程设计、使用&#xff0c;感兴趣的朋友可以下载看看哦 二、功能介绍 该源码功能十分的全面&#xff0c;具体介绍如下&…

企业如何加强合同风险控制?

企业运营的主要流程&#xff0c;不会因为企业人员规模或者业务规模大小的差异&#xff0c;而出现巨大的差异。 千万亿市值的上市公司、不足百人的新兴公司&#xff0c;面对的经营风险本质上不会有明显的区别。 那么&#xff0c;企业经营活动中&#xff0c;有哪些应对合同风险的…

从华为的C端产品服务体系看客户服务如何成为生产力

客户服务重要吗&#xff1f; 我想任何一个企业、企业家乃至员工都不会否认客户服务的重要性&#xff0c;但是实际上要转化为行动&#xff0c;就有难度了。不是所有的企业都能做到让客户服务为自己的品牌加分&#xff0c;甚至让客户服务成为开拓市场的利器。 一说到服务&#…

VA01/VA02/VA03/VA05 销售订单隐藏价格

1、业务需求 针对用户使用销售订单时&#xff0c;判断是否有权限&#xff0c;没有权限时隐藏销售订单抬头和行项目的价格相关字段 2、增强实现 2.1、隐藏抬头和行项目价格 隐藏抬头和行项目表格中的净值和净价字段 在程序MV45AFZZ→USEREXIT_FIELD_MODIFICATION中写隐式增强…

上海亚商投顾:沪指小幅调整 两市成交不足7000亿元

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 沪指9月8日探底回升&#xff0c;午后一度拉升翻红&#xff0c;深成指、创业板指走势稍弱。北斗板块全线爆发&a…

前端实习最终章

有一周没有写实习博客了&#xff0c;有点偷懒了&#xff0c;周三完成了最后一天的实习&#xff0c;与同事和leader进行了告别&#xff0c;然后与在深圳的同学吃了告别饭&#xff0c;正式离开深圳了&#xff0c;希望明年还可以在深圳工作&#xff01; 实习生活告一段落了&#…

SQL中的PowerDesigner逐步深入提问,你能掌握多少?

你提到了有PowerDesigner操作经验&#xff0c;请解释一下PowerDesigner是什么&#xff0c;以及它在数据库设计和开发中的作用是什么&#xff1f; 标准回答&#xff1a; PowerDesigner是一种数据库建模和设计工具&#xff0c;它用于创建数据库模型、设计表结构、定义关系和生成…

界面组件DevExpress WinForms v23.1 - 增强的图表、甘特图功能

DevExpress WinForms拥有180组件和UI库&#xff0c;能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForms能完美构建流畅、美观且易于使用的应用程序&#xff0c;无论是Office风格的界面&#xff0c;还是分析处理大批量的业务数据&#xff0c;它都能轻松胜…

RFID服装管理系统改善零售供应链

随着时尚零售业的竞争日益激烈&#xff0c;RFID技术正快速地改变着服装管理的方式。我们将探讨RFID服装管理系统的核心优点&#xff0c;以及如何在零售供应链中充分利用它。 首先&#xff0c;让我们了解一下RFID技术是什么。RFID是一种无线通信技术&#xff0c;通过使用RFID标…

酷开系统 | 酷开科技打造“客厅”新体验,带来家庭幸福感

聚焦家庭场景&#xff0c;客厅一直占据着C位&#xff0c;更多时候&#xff0c;人们在客厅里玩耍、追剧、聚会&#xff0c;甚至是工作。立足于客厅场景&#xff0c;从家庭入手&#xff0c;覆盖电视目标受众&#xff0c;不断提升内容服务质量&#xff0c;不仅能够提升整体幸福感和…