红黑树,看不懂你找我

数据结构之红黑树(还在为看不懂红黑树而烦恼吗?别再翻了,此篇足矣~)   红黑树,非常经典的数据结构,主要用于一些容器中,比如C++语言中的map、Java语言中的TreeMap(后面会写源码分析博客)。红黑树能保持高效的查找,一般取时间复杂度为O(log2n),由于高效,这个结构也比较复杂,所以很多人(包括我自己)都一直搞不懂红黑树到底是怎么插入、删除节点的。此篇博客,博主将图文并茂的一层一层揭开红黑树神秘面纱。   温馨提示:\color{red}温馨提示:温馨... 阅读详情

一:什么是红黑树

红黑树是AVL树的一种流行变种,是具有以下五个特点的二叉查找树:

  1. 每一个节点或者着成红色,或者着成黑色
  2. 根是黑色
  3. 每个叶节点Nil是黑色
  4. 如果一个节点是红色的,那么它的子节点必须是黑色的
  5. 每一条从某节点到某Nil指针的路径必须包含相同数目的黑色节点

二:关于红黑树的一般操作

对红黑树操作,最困难的就是保持上述的红黑树性质中的红色标记部分。

1.查找操作

红黑树是二叉查找树,所以其查找操作与一般的二叉查找树相同

  • 令根节点为当前节点
  • 当前节点为Nil,返回Nil
  • 要找的值等于当前节点,返回当前节点
  • 要找的值大于当前节点, 令右儿子为当前节点,重复步骤2
  • 要找的值小于当前节点,令左儿子为当前节点,重复步骤2

操作的时间复杂度O(logN)

2. 插入操作

当我们想向树中插入一个新节点时,通常把这个节点作为叶节点插入。

Part1:
假设把这个点涂成黑色,那完了,肯定违反了条件5,因为本来任意的节点到某Nil指针的路径中黑色节点数是相同的,现在加上黑色节点的这条路径黑色节点数度肯定会+1,于是原来的条件被破坏了,因此,新加的节点必须被涂成红色。

Part2:
如果新插入的节点的父节点是黑色的,那么直接插入新的红节点就完事了

Part3:
如果新插入的节点的父节点是红色,那么条件4就被破坏了,这种情况下,我们必须在保持条件5不被破坏的同时,利用改变节点颜色以及树的旋转来满足所有条件。

2.1 新节点:我是红色的,我爹是红色的,我叔叔是黑色的

在这里插入图片描述

  • 设置P为黑色
  • 设置G为红色
  • 进行右单旋转

在这里插入图片描述

  • 设置X为黑色
  • 设置G为红色
  • 进行右双旋转

还有对称的两种情况,操作也是对称的

2.2 新节点:我是红色的,我爹是红色的,我叔叔也是红色的

在这里插入图片描述

  • 把G节点设置为红色
  • 把P节点设置为黑色
  • 把S节点设置为黑色
    在这里插入图片描述
  • 把G节点设置为红色
  • 把P节点设置为黑色
  • 把S节点设置为黑色

这时候,如果G的父节点也是红的,那么G的颜色翻转的操作就会影响性质4,于是我们对G节点以及其父节点GP和父节点的兄弟节点GPS进行2.1所示的旋转操作。

注意如果G的父节点GP为红色,G父节点的兄弟节点GPS肯定不能为红色,只能为黑色,因为在红黑树中,不可能出现出现深度小于树的总深度且双兄弟都为红的情况,这种情况在其他的插入或删除过程中已经消除了。
在这里插入图片描述

GP刚好为根结点时,那么根据性质2,我们必须把GP重新设为黑色,那么树的红黑结构变为:黑黑红。换句话说,从根结点到叶子结点的路径中,黑色结点增加了。这也是唯一一种会增加红黑树黑色结点层数的插入情景。

还有对称的两种情况,操作也是对称的

伪代码

RB-INSERT(T, z)
	//红黑树插入
	y = T.nil
	x = T.root
	while x != T.nil
		y = x
		if z.key<x.key
		x = x.left
		else x = x.right
	z.p = y
	if y == T.nil
		T.root = z
	else if z.key < y.key
		y.left = z
	else y.right = z
	z.left = T.nil
	z.right = T.nil
	z.color = RED
	//对红黑树的性质进行恢复
	RB-INSERT-FIXUP(T, z)

RB-INSERT-FIXUP(T, z)
	//插入红色子节点,破坏了性质4时
	while z.p.color = RED
		//父节点为左子树
		if z.p == z.p.p.left
		 	//获取叔叔结点y
			y = z.p.p.right
			//叔叔结点为红色
			if y.color = RED
				z.p.color = BLACK
				y.color = BLACK
				z.p.p.color = RED
				z = z.p.p
			//叔叔结点为黑色
			else 
				//新插入的结点为父节点的右孩子,先来个父子调换,先进行一次左旋转
				if z == z.p.right
					z = z.p
					LEFT-ROTATE(T,z)
				//化成了叔叔结点黑色的一般情况
				z.p.color  = BLACK
				z.p.p.color = RED
				RIGHT-ROTATE(T, z.p.p)
		//对称情况
		else (same as then clause with "right" and "left" exchanged)
	T.root.color = BLACK			

难点来了,难点来了!!


其实不难

3.删除操作

删除操作一直一来是树这种ADT的难点所在

一般二叉搜索树的删除操作:

  • 该节点为叶节点的情况:可以直接删除,将其父节点的儿子指针设为Nil
  • 该节点只有一个非空子节点:可以直接删除,将其父节点的儿子指针指向其唯一儿子
  • 该节点有两个非空子节点:用该节点左子树的最大节点或者右子树的最小节点替换该节点,然后删除对应的左子树最大节点或者右子树最小节点,最终可以回到前两种情况。

好,到这里你肯定还是明白的对吧

现在考虑红黑树的删除操作。

注意:
根据一般二叉搜索树的删除操作来看,我们要删除的节点其实不一定是最终从图中移出去的节点,称最终从图中移出去的节点为替代点,我们先从右子树的最小节点(或左子树的最大节点)找到我们的替代点,与删除点的值交换,但是颜色都不变,然后再删除替代点,然后对树的性质进行恢复。而现在这些替代点都是一些树的末节点(区别于叶节点,我们现在将Nil节点视为黑色叶节点),删除操作便会简化许多,并可以归纳为像插入那样的几个类别。当然了替代点和我们要删除的点也有可能是同一点,但处理方法是一样的。

我们虽然删除了替代点,但是我们对树进行恢复时,还是会将该替代点放在树中参与恢复,恢复完成后再移掉。

在本文中,示例都默认是选择右子树的最小节点作为真正删除点,也可以选择左子树的最大节点

在这里插入图片描述

3.1替代点是红色的

直接从树中去掉即可,不会影响红黑树的性质,算法直接结束

不会出现替代点为红色且有儿子为非叶子节点的情况,所以这种情况是最简单的
在这里插入图片描述

3.2替代点是黑色的

替代点是黑色,那么删除之后树的性质就被破坏了,需要进行修复

3.2.1 有一个儿子为且必须为红色时

当替代节点只有一个儿子且为红色时
直接用它的红色儿子节点取代它,并将颜色改为黑色,这样所有经过替代节点的路径都将经过他的儿子,黑色高度不变。

在这里插入图片描述
注意这跟上面图不一样,这张图D节点是替代节点

不可能存在只有一个儿子且儿子为黑色的情况,那样本身就是不平衡的

3.2.2 有两个黑色儿子

当替代点是黑色的且有两个黑色儿子(可以为叶节点Nil)时,那他肯定有兄弟,那么又可以分为其他几类

  • 替代点是黑色,其兄弟节点是红色
  • 替代点是黑色,其兄弟节点是黑色
3.2.2.1 替代点的兄弟节点是红色

在这里插入图片描述

  • 将G节点也就是替代点的父节点设置为红色,
  • 兄弟节点S设置为黑色
  • 然后进行向左单旋转,

现在可以直接删掉D了吗?(以下都默认标识D为替代点) 不 行 , t a n 90 ° \hspace4ex 不行,tan90\degree 不行,tan90°

这个操作不改变任何路径的黑色高度,这时候删去D肯定会变的不平衡,我们只是把情况变为了兄弟节点为黑色的情况,也就是下面将要叙述的情况,我们接下来需要重新进入算法,进一步处理

3.2.2.2 替代点的兄弟节点是黑色

替代点D与其兄弟节点S都是黑色的,所以D的父节点颜色是不确定的,用绿色表示

又分为以下几种情况

3.2.2.2.1 当兄弟节点的两个儿子也都是黑色

在这里插入图片描述
PS:C1、C2可为Nil

  • S节点颜色变为红
  • G节点颜色变黑
  • 把G作为新的替代点进行下一轮操作

假设G一开始是黑色的,这个操作过后,所有一开始经过S节点的路径黑色高度-1,那么在删除D节点后,所有经过D节点的路径黑色高度也会-1,这棵子树大家黑色高度都减一,结局竟该死的甜美,但是经过G的比不经过G的黑色高度减一了,所以再在G上重新平衡处理

假设G一开始是红色的,这个操作后,所有一开始经过S节点的路径黑色高度不变,经过D的路径黑色高度+1,那么在删除D后,所有经过D节点的路径黑色高度又变回来了,结局竟还是该死的甜美,经过G为根的子树已经平衡了,再在G上重新平衡处理

注意当G是树的根时,就表示我们已经做完了,我们从所有路径去除了一个黑色节点,所有性质在上溯过程中都保持着。

3.2.2.2.2 当兄弟节点的左儿子是红色的,右儿子是黑色

在这里插入图片描述

  • C1设置为黑色
  • S设置为红色
  • 对S进行向右单旋转

这样的操作不改变任何路径的黑色高度,本来的平衡状态不变,所以删除D之后就破坏了原先的条件,还要进行自平衡变换,此时成了下面一种情况继续处理

3.2.2.2.3 当兄弟节点的右儿子是红色的,左儿子随意

在这里插入图片描述

  • 交换G和S的颜色
  • 设置兄弟节点的右儿子C2为黑色
  • 进行向左单旋转

该操作使所有变化前经过S节点的路径黑色高度都不变,经过D的路径黑色高度+1,在删除D后,所有经过G节点的路径都不变,达到平衡

说白了删除就是不断递归变换直到满足替代点的删除条件。

例子:删除30根节点
在这里插入图片描述

在这里插入图片描述
练习一下吧,这里有个在线红黑树工具,戳

三:渐进边界的证明

包含n个内部节点的红黑树的高度是 O ( l o g n ) O(logn) O(logn)

定义:

h ( v ) 表 示 以 节 点 v 为 根 的 子 树 的 高 度 。 {\displaystyle h(v)}表示以节点{\displaystyle v}为根的子树的高度。 h(v)表示以节点v为根的子树的高度。
b h ( v ) 表 示 从 v 到 子 树 中 任 何 叶 子 的 黑 色 节 点 的 数 目 {\displaystyle bh(v)}表示从{\displaystyle v}到子树中任何叶子的黑色节点的数目 bh(v)表示从v到子树中任何叶子的黑色节点的数目
( 如 果 v 是 黑 色 则 不 计 数 它 , 也 叫 做 黑 色 高 度 ) 。 (如果{\displaystyle v}是黑色则不计数它,也叫做黑色高度)。 (如果v是黑色则不计数它,也叫做黑色高度)。

引 理 : 以 节 点 v 为 根 的 子 树 有 至 少 2 b h ( v ) − 1 个 内 部 节 点 。 引理:以节点{\displaystyle v}为根的子树有至少2^{bh(v)}-1个内部节点。 引理:以节点v为根的子树有至少2bh(v)−1个内部节点。
引 理 的 证 明 ( 通 过 归 纳 高 度 ) : 引理的证明(通过归纳高度): 引理的证明(通过归纳高度):

归 纳 假 设 : 归纳假设: 归纳假设:
如 果 v 的 高 度 是 零 则 它 必 定 是 N I L , 因 此 b h ( v ) = 0 b h ( v ) = 0 。 所 以 : 2 b h ( v ) − 1 = 2 0 − 1 = 0 如果v的高度是零则它必定是NIL,因此{\displaystyle bh(v)=0}{\displaystyle bh(v)=0}。所以:2^{{bh(v)}}-1=2^{{0}}-1=0 如果v的高度是零则它必定是NIL,因此bh(v)=0bh(v)=0。所以:2bh(v)−1=20−1=0

如 果 h ( v ) = k , 有 2 b h ( v ) − 1 个 内 部 节 点 成 立 如果h(v)=k,有2^{bh(v)}-1个内部节点成立 如果h(v)=k,有2bh(v)−1个内部节点成立
于 是 h ( v ′ ) = k + 1 于是h(v')=k+1 于是h(v′)=k+1
因 为 v ′ 有 h ( v ′ ) > 0 所 以 它 是 个 内 部 节 点 。 同 样 的 它 有 的 两 个 儿 子 , 其 黑 色 高 度 要 么 是 b h ( v ′ ) 要 么 是 b h ( v ′ ) − 1 ( 依 据 v ′ 是 红 色 还 是 黑 色 ) 。 通 过 归 纳 假 设 每 个 儿 子 都 有 至 少 2 b h ( v ′ ) − 1 − 1 个 内 部 接 点 , 所 以 v ′ 有 : 因为v'有h(v')>0 \\所以它是个内部节点。同样的它有的两个儿子,其黑色高度要么是bh(v')要么是bh(v')-1(依据v'是红色还是黑色)。通过归纳假设每个儿子都有至少2^{{bh(v')-1}}-1个内部接点,所以v'有: 因为v′有h(v′)>0所以它是个内部节点。同样的它有的两个儿子,其黑色高度要么是bh(v′)要么是bh(v′)−1(依据v′是红色还是黑色)。通过归纳假设每个儿子都有至少2bh(v′)−1−1个内部接点,所以v′有:
2 b h ( v ′ ) − 1 − 1 + 2 b h ( v ′ ) − 1 − 1 + 1 = 2 b h ( v ′ ) − 1 个 内 部 节 点 。 2^{bh(v')-1}-1+2^{bh(v')-1}-1+1=2^{bh(v')}-1个内部节点。 2bh(v′)−1−1+2bh(v′)−1−1+1=2bh(v′)−1个内部节点。

使 用 这 个 引 理 我 们 现 在 可 以 展 示 出 树 的 高 度 是 对 数 性 的 。 因 为 在 从 根 到 叶 子 的 任 何 路 径 上 至 少 有 一 半 的 节 点 是 黑 色 ( 根 据 红 黑 树 性 质 4 ) , 根 的 黑 色 高 度 至 少 是 h ( r o o t ) 2 通 过 引 理 我 们 得 到 : 使用这个引理我们现在可以展示出树的高度是对数性的。\\ 因为在从根到叶子的任何路径上至少有一半的节点是黑色(根据红黑树性质4),\\根的黑色高度至少是 {\frac {h(root)}{2}}通过引理我们得到: 使用这个引理我们现在可以展示出树的高度是对数性的。因为在从根到叶子的任何路径上至少有一半的节点是黑色(根据红黑树性质4),根的黑色高度至少是2h(root)​通过引理我们得到:

n ⩾ 2 h ( r o o t ) 2 − 1 ↔    log ⁡ ( n + 1 ) ⩾ h ( r o o t ) 2 ↔    h ( r o o t ) ⩽ 2 log ⁡ ( n + 1 ) n ⩾ 2 h ( r o o t ) 2 − 1 ↔    log ⁡ ( n + 1 ) ⩾ h ( r o o t ) 2 ↔    h ( r o o t ) ⩽ 2 log ⁡ ( n + 1 ) {\displaystyle n\geqslant 2^{\frac {h(root)}{2}}-1\leftrightarrow \;\log {(n+1)}\geqslant {\frac {h(root)}{2}}\leftrightarrow \;h(root)\leqslant 2\log {(n+1)}}n\geqslant 2^{{{\frac {h(root)}{2}}}}-1\leftrightarrow \;\log {(n+1)}\geqslant {\frac {h(root)}{2}}\leftrightarrow \;h(root)\leqslant 2\log {(n+1)} n⩾22h(root)​−1↔log(n+1)⩾2h(root)​↔h(root)⩽2log(n+1)n⩾22h(root)​−1↔log(n+1)⩾2h(root)​↔h(root)⩽2log(n+1)

因 此 根 的 高 度 是 O ( log ⁡ n ) 因此根的高度是{\displaystyle {\text{O}}(\log n)} 因此根的高度是O(logn)

在这里插入图片描述

【树形结构】红黑树 {概念及性质;红黑树的结构;带头结点的红黑树;红黑树的实现;红黑树插入操作详细解释;红黑树的验证} 阅读详情

相关推荐

红黑树解析

写在前面:我是「且听风吟」,目前是某上市游戏公司的大数据开发工程师,热爱大数据开源技术,喜欢分享自己的所学所悟,现阶段正在从头梳理大数据体系的知识,以后将会把时间重点放在Spark和Flink上面。 如果你也对大数据感兴趣,希望在这个行业一展拳脚。欢迎关注我,我们一起努力,一起学习。博客地址:https://ropledata.blog.youkuaiyun.com 博客的名字来源于:且听风吟,静待花开。也符合我对技术的看法,想要真正掌握一门技术就需要厚积薄发的毅力,同时保持乐观的心态。 你只管努力,剩下的交给.

静待花开 2229

数据结构 —— B树

文章目录1、B树的定义1.1、B树的补充说明:1.2 、`B树` == `B-树` == `B-tree` == `B tree`的区别2、B树的插入操作下面以5阶B树为例,介绍B树的插入操作,3、 B树的删除操作下面以5阶B树为例,介绍B树的删除操作 1、B树的定义 B-tree 即 B树,B 即 Balanced,平衡的意思。 B树 是一颗多路平衡查找树。 我们描述一颗B树时需要指定...

猎人在吃肉 3万+

PrimeTime生成.lib竟暗藏PG添加Bug

1. 确认原始库中是否包含PG引脚的定义。2. 查阅PrimeTime的write_lib命令文档,寻找相关选项。3. 在生成库时使用正确的选项,例如-include_pg_pins或类似参数。4. 验证生成的.lib文件是否包含pg_pin部分。

limanjihe的专栏 1919

数据结构学习笔记之B树与B+树

B树与B+树,与二叉排序树一样,也常用于查找算法中,本文学习这两种结构的基本概念与基本操作。

御承扬的博客 1万+

目标检测——布匹缺陷检测数据集

结构瑕疵指的是布料本身的缺陷,包括嵌结、抽纱、错纱、断纱、预缩等问题,这些问题通常是在布料生产过程中出现的。而质量瑕疵则是指布料在使用过程中出现的问题,如污渍、断裂、鼓囊、针眼等,这些问题可能由生产过程中的结构瑕疵导致,也可能是在运输、存放和使用过程中引起的。布匹瑕疵如缺纬、断纬、粗纬、松纬、缺经、断经、粗经、筘痕、污点、破损等,若未得到及时有效的检测,这些瑕疵产品可能会流向市场,导致消费者的不满和退货,严重影响企业的声誉和品牌形象。织疵包括缺经、缺纬、跳花、弓纱、错纱、厚薄段、油污渍等;

zzjlhlcd的博客 612

ADRV9026初始化避坑指南:手把手调试PostMcsInit常见故障

本文详细解析了ADRV9026多片同步初始化过程中的PostMcsInit常见故障,包括时钟校准失败、JESD链路建立问题和ARM核通信异常等。通过实际项目经验,提供了硬件检查清单、软件配置要点和分层诊断方法,帮助工程师快速定位和解决问题,提升系统稳定性。

hadoop5ranger的博客 620

数据结构---B树

B-树B+树B*树的介绍以及B-树的模拟实现

qq_68695298的博客 5892

Android - 蓝牙开发

文章目录科普SIG类型制式编程Classic BluetoothBluetooth Low Energy蓝牙的UUID是什么?有什么用? 科普 https://zh.wikipedia.org/wiki/%E8%97%8D%E7%89%99 蓝牙(英语:Bluetooth),一种无线通讯技术标准,用来让固定与移动设备,在短距离间交换资料,以形成个人局域网(PAN)。其使用短波特高频(UHF)无线电波,经由 2.4 至 2.485 GHz 的 ISM(工业、科学、医疗)频段来进行通信。1994 年由电信商

qq_43323826的博客 1万+

B-树(高阶数据结构)

若树为空,直接插入新结点,该结点为树的根结点树非空,找待插入关键字在树中的插入位置(找到的插入结点位置一定是叶子结点)检测是否找到插入位置(假设树中的key唯一,即该元素已经存在时则不插入)按照插入排序的思想将该关键字插入到找到的结点中检测该结点关键字数量是否满足B-树的性质:即该节点中的元素个数是否等于M,若小于则满足,插入结束若插入后结点不满足B树的性质,需要对该结点进行分裂:申请新的兄弟结点找到该结点的中间位置将该结点中间位置右侧的元素以及其孩子搬移到新结点中。

GG_Bruse的博客 6555

基于FISCO BCOS 部署可升级的 Solidity存证智能合约

本文介绍了基于FISCOBCOS平台的可升级Solidity存证智能合约实现方案。采用透明代理模式,包含逻辑合约、代理合约和管理合约三部分,支持业务逻辑升级而不影响存储数据。详细阐述了合约架构设计、Solidity代码实现、Go SDK交互流程以及完整的部署升级步骤。方案具有数据持久性、版本兼容性和生产就绪等特点,提供了权限控制、输入验证等安全机制,并包含监控管理工具。该实现为企业级区块链存证应用提供了可靠的基础架构,支持后续功能扩展和定制化开发。

分享AI、区块链技术及应用,未来已来 1514

ADS电路仿真方法综述:原理与应用

在射频与微波电路设计中,精确的仿真技术是验证性能的关键。ADS(Advanced Design System)作为行业标准工具,集成了多种仿真方法,适用于不同场景。本文将系统解析瞬态分析、谐波平衡(HB)、交流分析(AC)、直流分析(DC)、S参数、大信号SP(LSSP)及包络分析的原理、实现机制与应用场景。

u014344410的博客 480

数据结构(54) B树、B+树

1、B树 1.1、B树的定义 B树,又称多路平衡查找树,B树中所有结点的孩子个数的最大值称为B树的阶,通常用m表示。一棵m阶B树或为空树,或为满足如下特性的m叉树: 1)树中每个结点至多有m棵子树,即至多含有m-1个关键字。 2)若根节点不是终端结点,则至少有两棵子树。 3)除根节点外的所有非叶结点至少有棵子树,即至少含有个关键字。 4)所有非叶结点的结构如下: Ki(i = 1,2,...,n)代表关键字且满足K1<K2<...<Kn; Pi(i = 0,1,...,

李白 1万+

【YOLOv11多模态涨点改进】独家创新首发| TGRS 2026 |引入 CIFusion 通道交互融合模块,通过跨特征交互机制强化目标区域响应,适合多模态融合目标检测,小目标检测高效涨点

🔥本文提出了一种改进YOLOv11多模态目标检测模型的方法,通过引入CIFusion通道交互融合模块来提升RGB与红外特征融合效果。CIF模块采用通道级自适应交互机制,根据全局上下文动态分配不同模态通道的重要性,实现跨模态特征交互与互补信息融合。相比传统拼接或加权融合方式,CIF能够增强目标区域响应,抑制背景噪声,提高小目标和低对比度目标的检测性能。实验表明,该方法在DroneVehicle等数据集上显著提升了检测精度。论文还详细介绍了CIF模块的结构原理、实现代码及模型配置方法。

Ai缝合怪、助力小伙伴高效发论文 186

红黑树

红黑树 从 234 树 到 红黑树:https://blog.youkuaiyun.com/asdfsadfasdfsa/article/details/86500552 定义 2-3-4 树和红黑树是完全等价的,由于绝大多数编程语言直接实现2-3-4树会非常繁琐,所以一般是通过实现红黑树来实现替代2-3-4树,而红黑树本也同样保证在O(lgn)的时间内完成查找、插入和删除操作。 红黑树是每个节点都带有颜色属...

hc372893308的博客 7628

新系统申请软件著作权详细操作说明

今年八月底版权中心系统升级,新系统相对好用一些,至少不用再拿IE访问了,但是多了一项实名认证。下面介绍新系统的操作流程。 目录注册、登录和实名认证注册登录实名认证软件登记申请申请表填写鉴别材料身份证明文件权利归属证明文件其他材料提交材料变更登记 注册、登录和实名认证 首先访问版权中心系统:https://register.ccopyright.com.cn/login.html,如果老系统有账号直接登录即可,没有的话需要注册。 注册 点击注册按钮进入注册。 根据实际情况选择个人或单位,每个个人或单位只能在

Programming Talk 1万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

红黑树介绍

红黑树一、红黑树的概念红黑树的性质红黑树节点的定义红黑树结构二、使用步骤1.引入库2.读入数据总结 一、红黑树的概念 红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。 通过任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的。 红黑树的性质 每个结点不是红色就是黑色 根节点是黑色的 如果一个节点是红色的,则它的两个孩子结点是黑色的 对于每个结点,从该结点到其所有后代叶结点的简单路径上,均 包含相同数

mz474920631的博客 4万+

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

【C++】红黑树

因为每个节点都存在颜色,并且不为黑色就为红色,所以我们可以定义一个表示颜色的枚举常量。红黑树依旧是三叉链。

bushibrnxiaohaij的博客 2963

红黑树原理详解

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

Tattoo的博客 3万+

什么是红黑树?

由于父结点22是红色结点,因此这种情况打破了红黑树的规则4(每个红色结点的两个子结点都是黑色),必须进行调整,使之重新符合红黑树的规则。经过上面的调整,以结点25为根的子树符合了红黑树规则,但结点25和结点17成为了连续的红色结点,违背规则4。旋转红黑树的两个结点,使得父结点被自己的右孩子取代,而自己成为自己的左孩子。旋转红黑树的两个结点,使得父结点被自己的左孩子取代,而自己成为自己的右孩子。显然,新结点21和它的父结点22是连续的红色结点,违背了规则4,我们应该如何调整呢?

初念初恋的博客 1万+

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

RED,BLACK, _kv(kv){}private:_left、_right 和 _parent 分别指向节点的左子节点、右子节点和父节点。_kv 是一个 pair,存储节点的键和值。_col 表示节点的颜色,可以是 RED 或 BLACK。接收一个 pair 作为参数,初始化节点的键值对,并将节点的颜色初始化为 RED。其他指针成员初始化为 nullptr。

bhbcdxb123的博客 2166

红黑树源码解读,附带【左旋/右旋】动图 (代码不想看 或看不懂 直接越过看总结)

源码解读 红黑树介绍 平衡插入算法(插入的节点默认为红色) 左旋算法 总结: 变颜色条件:两个连续红色节点,并且叔叔节点是红色 左旋条件:两个连续红节点,并且叔叔节点是黑色 , 下面的红色节点在右子树 情况1 情况2 右旋条件:两个连续红节点,并且叔叔节点是黑色 , 下面的红色节点在左子树 情况1 情况2

qq_33739230的博客 5599

红黑树是什么?红黑树的作用?红黑树的调整?

前戏红黑树,对很多童鞋来说,是既熟悉又陌生。熟悉是因为在校学习期间,准备面试时,这是重点。然后经过多年的荒废,如今已经忘记的差不多了。如果正在看文章的你,马上快要毕业,面临着找工作的压力;又或者你觉得需要将这块知识重新复习一遍;又或者只是看看,那么恭喜你,赚到了。那么我将带领大家重新认识下红黑树,用简单的语言,搞懂红黑树。在学习红黑树之前,咱们需要先来理解下二叉查找树(BST)。二叉查找树要想了解...

好热 3664

C++——红黑树

C++之红黑树板块讲解

dongxue727504的博客 3277

C++之红黑树

红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的。 4.2.2 红黑树的性质 1. 每个结点不是红色就是黑色 2. 根节点是黑色的 3. 如果一个节点是红色的,则它的两个孩子结点是黑色的,但是没有连续的红节点 4. 对于每个结点,从该结点到其所有后代叶结点的简单路径...

cls的博客 2398

C++中红黑树的实现 -- 红黑树的概念,红黑树的规则,红黑树插入时的情况分析,红黑树的实现,红黑树的查找,红黑树的验证

红黑树是一种自平衡二叉搜索树,通过颜色约束确保最长路径不超过最短路径的两倍。其核心规则包括:根节点为黑色、红色节点不能连续、每条路径黑色节点数相同。插入操作涉及变色和旋转两种调整方式,根据叔叔节点颜色分为不同处理情况。与AVL树相比,红黑树平衡要求较宽松,旋转次数更少,但查找效率相近(O(logN))。本文详细介绍了红黑树的结构定义、插入逻辑(包括单旋和双旋场景)、验证方法,并提供了与AVL树的性能对比测试代码,显示两者在百万级数据下的操作耗时相当。

CSQCSQCC的博客 1614
上一篇: 你了解欧拉回路吗?(附Java实现代码)
下一篇: 从JVM看类的加载过程与对象实例化过程
Hack Rabbit
Hack Rabbit 新星创作者: 运维技术领域 新星创作者: 运维技术领域
博客等级 码龄9年 2893粉丝 67原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

Hack Rabbit

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

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

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

打赏作者

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

抵扣说明:

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

余额充值