C++ RBTree 理论

目录

这个性质可以总结为

红黑树的最短最长路径

红黑树的路径范围

code

结构

搞颜色

插入

插入逻辑

新插入节点

思考:2. 检测新节点插入后,红黑树的性质是否造到破坏?

解决方法

变色

旋转+变色

第三种情况,如果根节点上面还有节点


这个性质可以总结为

1.每个节点不是红色就是黑色

2.根节点是黑色的

3.不能有两个连续的红色节点  ,即可以出现 红黑  黑黑 不能出现红红

4.每条路径上的黑色机节点数量不一样

至于性质5:每个叶子结点都是黑色的,这里的叶子节点并不是真的叶子节点,而是NIL节点,即空节点。如图(a):

NIL节点有什么作用?如图(a-2),有多少条路径:

正确答案是有7条。路径路径的判断规则是:从根节点到NULL。

如果我们把NIL节点标记出来就好找路径了:

再比如,图(a-3)是否是红黑树:

大致一看好像是,但是把NIL节点标出来之后:

 路径(b)只有两个黑色节点,不满足红黑树的性质,不是红黑树。

红黑树的最短最长路径

那么红黑树的最短路径是什么样子的,应该是全黑的最短:

 那最长的路径呢,应该是一黑一红间隔排列的最长:

根据图(a-1)我们可以看出,最长的路径是最短的路径的2倍。

ps

一个红黑树不一定有最长路径,也不一定有最短路径。

如图(a-2),有最短路径,没有最长路径:

红黑树的路径范围

而知道了最短路径,最长路径,剩下的路径都在最短路径,最长路径范围内,可以写为

                             [n,2*n]

code

结构

template<class K,class V>
 struct	RBTreeNode
{
	 RBTreeNode<K,V>* _left;
	 RBTreeNode<K, V>* _right;
	 RBTreeNode<K, V>* parent;
	 pair<K, V>;
	Color _col;

	//初始话列表
	RBTreeNode(const pair<K, V>kv)
		:_left(nullptr)
		,_right(nullptr)
		, _parent(nullptr)
		, pair<K, V>
		,_col(RED)
	{}
};

搞颜色

enum Color
{
	RED,
    BALACK
};


 template<class  K,class V>
 class RBTree
 {
	 typedef RBTreenode<k,v> Node;
 public:

 private:
	 Node* _root = nullptr;


 };

插入

插入逻辑

如果节点为空,就给黑色。如果节点不为空,就插入值。

这个值如果比根节点小,就往左边插入,否则就往右边插入。


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

		 //初始化父亲节点和根节点
		 Node* parent = nullptr;
		 Node* cur = _root;

		 while (cur)
		 {

			 //key值大,往右走
			 if (cur->kv.first < kv.first)
			 {
				 cur = cur->right;
			 }
			 //key值小,往左走
			 else if (cur->kv.first > kv.first)
			 {
				 cur = -cur->left;
			 }
			 //否则key值和当前节点相等,不插入
			 else
			 {
				 return false;
			 }
		 }


		 //找到了返回true1
		 return true;	 
	 }

新插入节点

思考:2. 检测新节点插入后,红黑树的性质是否造到破坏?

如图(b-1),现在要插入一个节点,那么是插入一个黑色节点还是红色节点呢?

如果插入黑色节点,那么该路径就会多一个黑色节点,根据红黑树特性,其他路径都要补一棵黑色节点,

如果插入红色节点,则只会影响父节点

(即

1.如果父节点也会红节点。两个红节点不能紧挨,需调整

2.如果父亲节点是黑色,则不需调整,直接插入。)。

我们看一下怎么调整,如图(b-2),新插入了一个红色节点7:

解决方法

能变色先变色,变色完之后还不行再旋转

变色

如图(b-3),先把父节点8变黑:

这个时候该路径就多了一个黑色节点,再变图(b-4)把6节点变红:

这个时候该路径又少了个黑色节点,再变图(b-5) 把5节点变黑:

旋转+变色

第二种情况,例如图(b-6):如果还是把父节点变为黑色,把6节点变为红色,那么其他路径就会多一个黑色节点。

而该路径又没有其他节点可以再变黑色来平衡这种状态,所以靠变色解决不了这个问题。

这个时候就要旋转了。

先右旋为图(c-1):

再左旋为图(c-2):

然后再变色为图(c-4):

第三种情况,如果根节点上面还有节点

如图(d-0),新插入了一个节点cur:

cur为红色节点,那就需要调整。

把p节点变为黑色节点,那么为了u节点也要变为黑色节点,那么此时就要把g节点变为红色节点。也就是图(d-1)

为什么要把g节点变为红色节点呢?

假设g节点不变为红色也就是图(d-3):

由图(d-1)变为图(d-3)我们发现每条路径凭空多了1个黑色节点。

g节点上面还有节点,那么多了个黑色节点,就会影响上面的路径,所以需要把g节点变红来平衡一下。

如图(d-1):

这个时候万一g节点的父节点是红色节点,如图(d-4):
两个红色节点不能连续,还要调整,如果g节点的父亲节点为黑色,如图(d-5),那就不需要再调整:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

聊天机器人框架Rasa资源整理

Rasa是一个主流的构建对话机器人的开源框架&#xff0c;它的优点是几乎覆盖了对话系统的所有功能&#xff0c;并且每个模块都有很好的可扩展性。参考文献收集了一些Rasa相关的开源项目和优质文章。 一.Rasa介绍 1.Rasa本地安装 直接Rasa本地安装一个不好的地方就是容易把本地…

使用电脑时提示msvcp140.dll丢失的5个解决方法

“计算机中msvcp140.dll丢失的5个解决方法”。在我们日常使用电脑的过程中&#xff0c;有时会遇到一些错误提示&#xff0c;其中之一就是“msvcp140.dll丢失”。那么&#xff0c;什么是msvcp140.dll呢&#xff1f;它的作用是什么&#xff1f;丢失它会对电脑产生什么影响呢&…

Docker快速入门

Docker是一个用来快速构建、运行和管理应用的工具。 Docker技术能够避免对服务器环境的依赖&#xff0c;减少复杂的部署流程&#xff0c;有了Docker以后&#xff0c;可以实现一键部署&#xff0c;项目的部署如丝般顺滑&#xff0c;大大减少了运维工作量。 即使你对Linux不熟…

36 Gateway网关 快速入门

3.Gateway服务网关 Spring Cloud Gateway 是 Spring Cloud 的一个全新项目&#xff0c;该项目是基于 Spring 5.0&#xff0c;Spring Boot 2.0 和 Project Reactor 等响应式编程和事件流技术开发的网关&#xff0c;它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式…

C++初阶--类与对象(3)(图解)

文章目录 再谈构造函数初始化列表隐式类型转换explicit关键字 static成员友元类内部类匿名对象拷贝函数时的一些优化 再谈构造函数 在我们之前的构造函数中&#xff0c;编译器会通过构造函数&#xff0c;对对象中各个成员给出一个适合的初始值&#xff0c;但这并不能称之为初始…

链表经典面试题之二

今天我们做一道环形链表的题目力扣141题https://leetcode.cn/problems/linked-list-cycle/ 这道题让我们分析链表中是否存环&#xff0c;存在的话返回true&#xff0c;不存在返回false。首先看到这道题我们要捋顺思路&#xff0c;怎么才能达到它要的效果&#xff1f;要找出是否…

Leetcode刷题详解—— 组合总和

1. 题目链接&#xff1a;39. 组合总和 2. 题目描述&#xff1a; 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 &#xff0c;并以列表形式返回。你可以按 任意顺序 返回这些…

【网络开发必看】聊聊 Tomcat

文章目录 1. 什么是 Tomcat2. 怎么安装 Tomcat3. Tomcat 的目录结构3.1 bin 目录3.2 conf 目录3.3 lib 目录3.4 log 目录3.5 webapps 目录 4. 启动 Tomcat总结 1. 什么是 Tomcat Tomcat 是一个 HTTP 服务器. 前面学习了 HTTP 协议, 知道了 HTTP 协议就是规定 HTTP 客户端和 HT…

论文笔记:AttnMove: History Enhanced Trajectory Recovery via AttentionalNetwork

AAAI 2021 1 intro 1.1 背景 将用户稀疏的轨迹数据恢复至细粒度的轨迹数据是十分重要的恢复稀疏轨迹数据至细粒度轨迹数据是非常困难的 已观察到的用户位置数据十分稀疏&#xff0c;使得未观察到的用户位置存在较多的不确定性真实数据中存在大量噪声&#xff0c;如何有效的挖…

ffmpeg安装教程(windows、Linux下python环境)

本文旨在向大家介绍ffmpeg在Windows和Linux系统中的安装方法。 目录 一、Windows 安装 ffmpeg1.1 官网下载 ffmpeg 运行程序1.2 环境配置1.3 测试 二、Linux 安装ffmpeg2.1 Linux中安装ffmpeg2.2 python环境安装 ffmpeg2.1.1 为什么要介绍这个2.1.1 成功安装示例 一、Windows …

OpenCV-Python小应用(九):通过灰度直方图检测图像异常点

OpenCV-Python小应用&#xff08;九&#xff09;&#xff1a;通过灰度直方图检测图像异常点 前言前提条件相关介绍实验环境通过灰度直方图检测图像异常点代码实现输出结果 参考 前言 由于本人水平有限&#xff0c;难免出现错漏&#xff0c;敬请批评改正。更多精彩内容&#xff…

笔记:AI量化策略开发流程-基于BigQuant平台(一)

从本文开始&#xff0c;按照AI策略开发的完整流程&#xff08;共七步&#xff09;&#xff0c;上手在BigQuant平台上快速构建AI策略。本文首先介绍如何使用证券代码模块指定股票范围和数据起止日期。重要的事情说三遍&#xff1a;模块的输入端口有提示需要连线的上游数据类型&a…

Activiti6工作流引擎:Form表单

表单约等于流程变量。StartEvent 有一个Form属性&#xff0c;用于关联流程中涉及到的业务数据。 一&#xff1a;内置表单 每个节点都可以有不同的表单属性。 1.1 获取开始节点对应的表单 Autowired private FormService formService;Test void delopyProcess() {ProcessEngi…

十八数藏的新时代探索:数字创新助推文化保护

在这个数字化的新时代&#xff0c;传统文化和数字创新的结合呈现出令人振奋的新面貌。十八数藏&#xff0c;作为文化数字创新的佼佼者&#xff0c;正以数字化的手段助推文化的保护与传承。 十八数藏通过数字技术&#xff0c;将传统非物质文化遗产以数字形式呈现&#xff0c;使其…

红黑树-RBTree

目录 1. 红黑树的概念2. 红黑树的性质3. 结点的定义4. 结点的插入5. 整体代码 1. 红黑树的概念 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是Red或Black。 通过对任何一条从根到叶子的路径上各个结点着色方式…

Echarts柱状体实现滚动条动态滚动

当我们柱状图中X轴数据太多的时候&#xff0c;会自动把柱形的宽度挤的很细&#xff0c;带来的交互非常不好&#xff0c;因此就有一个属性来解决&#xff1a;dataZoom 第一种简易的版本&#xff0c;横向滚动。 dataZoom: {show: true, // 为true 滚动条出现realtime: true, // 实…

第七章 块为结构建模 P4|系统建模语言SysML实用指南学习

仅供个人学习记录 这部分感觉很模糊&#xff0c;理解的不好&#xff0c;后面的图也没画了&#xff0c;用到的时候再来翻书 应用端口实现接口建模 端口port表示了块边界上的一个访问点&#xff0c;也可以是由该块分类的任何组成或引用边界上的可访问点。一个块可以有多个端口规…

Java学习 10.Java-数组习题

一、创建一个 int 类型的数组, 元素个数为 100, 并把每个元素依次设置为 1 - 100 代码实现 public static void main(String[] args) {int[] arrnew int[100];for (int i 0; i < arr.length; i) {arr[i]i1;}System.out.println(Arrays.toString(arr));} 运行结果 二、改变…

指针传 1

1. 内存 在计算机中内存划分为⼀个个的内存单元&#xff0c;每个内存单元的⼤⼩取1个字节。每个内存单元放了八个bite位&#xff0c;就像我们在高中时住的八人间&#xff0c;那么每个人就代表了一个bite位。 每个内存单元也都有⼀个编号&#xff08;这个编号就相当 于我们所住…

2000-2022年上市公司数字化转型同群效应数据

2000-2022年上市公司数字化转型同群效应数据 1、时间&#xff1a;2000-2022年 2、指标&#xff1a;股票代码、年份、行业代码、行政区划代码、数字化转型程度-A、数字化转型程度-B、同行业同群-数字化转型程度-A_均值、同行业同群-数字化转型程度-A_中位数、同省份同群-数字化…