红黑树详解

红黑树的概念与性质

 前置知识

在学习红黑树之前,最好有二叉查找树和AVL树的基础,因为红黑树本质就是一种特殊的二叉查找树,而红黑树的操作中需要用到AVL树中旋转的相关知识。至于二叉查找树和AVL树,可以参考如下两篇博客:

二叉查找树:二叉查找树-CSDN博客

AVL树:AVL树详解_avl tree-CS  DN博客


红黑树是一种特殊的二叉查找树,顾名思义,红黑树的一个特性就是每个节点都有一个颜色特征,或为红或为黑。红黑树可以通过一系列的限制规则保证最长路径小于最短路径的两边,也就是说,红黑树的每一条路径长度的范围为[N, 2N],其中N为最短路径长度。

与AVL树不同的是,红黑树并不是严格意义上的平衡二叉树,降低了插入和旋转的次数,所以在经常进行增删的结构中性能比AVL树更优。

红黑树是通过如下5条性质/规则来维护的:

  1. 每个结点不是红色就是黑色
  2. 根节点必须是黑色的
  3. 红色节点的孩子结点只能是黑色的,即路径上不能出现两个连续的红节点
  4. 从任一节点到其每个叶子的所有路径,要包含相同数目的黑色节点
  5. 所有的叶子结点都是黑结点

注意,由于翻译的问题,这里的叶子节点实际上指的其实是NIL节点(空节点)。所以,第5条并不算是一条规则,而是一个性质的说明。

那么为什么说这几条性质就保证了最长路径不会大于最短路径的二倍呢?首先,根节点一定是黑的就保证了每条路径的开始都是一个黑色节点。不能出现连续的红节点而且每条路径的黑色结点数量要保持一致,这种的话最短路径的情况就是整条路径都为黑色的情况,而最长路径的情况就是一黑后面紧跟着一红结点。所以我们很容易应证,最长路径不会超过最短路径的二倍。

红黑树的插入

红黑树本质上就是一种特殊的二叉查找树,所以大纲上我们依旧是按照二叉查找树的方式来插入。但是特别的,红黑树还维护了结点的颜色这一特性,所以我们还需要额外维护结点的颜色已经遵循上述的条规则/性质。

首先我们要思考,插入新结点时,是将其初始化为红色还是黑色。我们知道红黑树要控制每条路径的黑色结点相同,所以为了安全起见,一般是插入节点都默认初始化为红色节点。特别的,红黑树还要保证根节点为黑色,所以我们还需要对根节点的情况特殊处理。也就是说,除了根节点的情况外,新插入的结点都是统一初始化为红色,后续就根据具体情况具体调整了。

那么新插入结点默认为红结点,就必然会出现插入之后连续两个红色结点的情况,那么我们可以将插入之后出现连续红色结点的各种情况分为两大类来说:

首先我们规定,cur为当前新插入的节点,p为父节点,g为祖父节点,u为叔叔节点。

  • 情况1:cur为红,p为红,u存在且为红,g为黑

这里需要解释一下,cur为新插入节点,如果p是红的,那么根据红黑树的性质,g一定是黑的。这种叔叔节点存在且为红的情况比较好处理,只需要让父亲节点p和叔叔节点u的颜色置黑,g节点置黑即可。

首先,把p和u置黑是因为不能出现连续的红色节点。而把g置红是因为g并不一定就是根节点,所以为了不影响本条路径的黑色节点的数量,是需要将p置红的。那么如果g真的为根节点的话不就又与性质冲突了吗?所以我们需要特殊情况特殊处理,一般来说前面照常操作,最后之间暴力将根节点颜色设置为黑色是一种较为简便好理解的方式。

我们要知道,红黑树节点调整要在保证不改变路径上黑色节点数量的情况下进行调整,所以当叔叔节点存在且为红的时候,我们就可以通过将叔叔节点置黑,使得在保证路径上黑色节点数量不变的前提下,调整两个连续的红色节点。

  • 情况2:cur为红,p为红,g为黑,u不存在/u存在且为黑

那么当叔叔节点为黑色呢?这时我们就无法直接通过简单颜色来进行调整了,此时就需要用到AVL树中提到的4个旋转了。根据p和cur的位置,共有四种旋转的情况。不过由于双旋与单旋之后原来g位置的节点可能为cur也可能为p,所以我们这时就不能单纯的将cur置红或置黑。而是将旋转之后原g位置的节点置黑,将其两个子节点置红,叔叔节点一直是黑的或者空,所以不用对其处理。

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

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

相关文章

01、Tensorflow实现二元手写数字识别

01、Tensorflow实现二元手写数字识别(二分类问题) 开始学习机器学习啦,已经把吴恩达的课全部刷完了,现在开始熟悉一下复现代码。对这个手写数字实部比较感兴趣,作为入门的素材非常合适。 基于Tensorflow 2.10.0 1、…

C#,《小白学程序》第一课:初识程序,变量,数据与显示

曰:扫地僧练就绝世武功的目的是为了扫地更干净。 1 引言 编程只是一项技术,如包包子,不是什么高深的科学。 学习程序最不好的方法是先学习枯燥的语法。 学习程序主要是用代码解决问题。因此,我们抛开所有的语法与诸多废物&…

【Tiny_CD】Tiny_CD变化检测网络详解(含python代码)

题目:TinyCD: A (Not So) Deep Learning Model For Change Detection 论文:paper 代码:code 目录 🍟 🍟1.摘要 🍗🍗 2.贡献 🍖🍖 3.网络结构

classifier-free-guidance 扩散模型引导生成

浅谈扩散模型的有分类器引导和无分类器引导 - 知乎这篇文章主要比较一下扩散模型的引导生成的三种做法的区别。它们分别是用显式分类器引导生成的做法,用隐式无分类器引导的做法和用CLIP计算跨模态间的损失来引导生成的做法。 Classifier-Guidance: Diffusion Mode……

React + BraftEditor 实现富文本编辑

Braft Editor 是一个基于 React 和 Draft-js 开发的富文本编辑器,提供了丰富的基础功能,如基本文本格式化、列表、链接、图片上传、视频插入等,并且还支持扩展。 首先,确保你已经在项目中安装了 Braft Editor 和它的依赖项&#x…

腾讯云发布新一代基于AMD处理器的星星海云服务器实例SA5

基础设施的硬实力,愈发成为云厂商的核心竞争力。 11月24日,腾讯云发布了全新一代星星海服务器。基于自研服务器的高密设计与硬件升级,对应云服务器SA5是全球首家搭载第四代AMD EPYC处理器(Bergamo)的公有云实例&#…

【机器学习】平滑滤波

平滑滤波技术 平滑滤波,顾名思义就是对信号进行处理使之整体显得更加平滑,降低噪声影响,提高信号质量,它常见于数字信号处理和图像处理,一般意义上的数字信号多体现于一维数据,图像信号多体现于二维数据。…

大众博客系统测试报告【改】

一、项目背景 大众博客系统采用前后端分离的方法来实现,同时使用了数据库来存储相关的数据,同时将其部署到云服务器上。前端主要有四个页面构成:登录页、列表页、详情页以及编辑页,以上模拟实现了最简单的大众博客系统。其结合后端…

DGL在异构图上的GraphConv模块

回顾同构图GraphConv模块 首先回顾一下同构图中实现GraphConv的主要思路(以GraphSAGE为例): 在初始化模块首先是获取源节点和目标节点的输入维度,同时获取输出的特征维度。根据SAGE论文提出的三种聚合操作,需要获取所…

Day40力扣打卡

打卡记录 包子凑数(裴蜀定理 DP) 根据裴蜀定理,存在 c gcd(a, b) 使不定方程ax by c满足条件,如果gcd(a, b) 1即a与b互素的情况下,就会 ax by 1,由于为1可以构造后面的无穷数字,故得到结…

项目实战详细讲解带有条件响应的 SQL 盲注、MFA绕过技术、MFA绕过技术、2FA绕过和技巧、CSRF绕过、如何寻找NFT市场中的XSS漏洞

项目实战详细讲解带有条件响应的 SQL 盲注、MFA绕过技术、MFA绕过技术、2FA绕过和技巧、CSRF绕过、如何寻找NFT市场中的XSS漏洞。 带有条件响应的 SQL 盲注 这篇文章的核心要点如下: 漏洞发现:作者在Portswigger提供的实验室中发现了一个盲SQL注入漏洞。这个漏洞存在于一个应…

【libGDX】Mesh纹理贴图

1 前言 纹理贴图的本质是将图片的纹理坐标与模型的顶点坐标建立一一映射关系。纹理坐标的 x、y 轴正方向分别朝右和朝下,如下。 2 纹理贴图 本节将使用 Mesh、ShaderProgram、Shader 实现纹理贴图,OpenGL ES 的实现见博客 → 纹理贴图。 DesktopLauncher…

Prometheus环境搭建和认识

Prometheus 环境搭建 1.prometheus 简介 Prometheus是基于go语言开发的一套开源的监控、报警和时间序列数据库的组合,是由SoundCloud公司开发的开源监控系统,Prometheus于2016年加入CNCF(Cloud Native Computing Foundation,云原生计算基金…

虾皮插件:优化Shopee商家店铺运营的利器

在如今竞争激烈的电商市场中,如何提升Shopee商家店铺的运营效率和销售业绩成为了摆在每个商家面前的一道难题。然而,幸运的是,虾皮插件-知虾的出现为商家们带来了一种全新的解决方案。本文将介绍虾皮插件的用途和优势,并详细介绍其…

【第一部也是唯一一部】3DMAX脚本语言MAXScript 中文帮助

3DMAX我们很多3D设计师和艺术家都在使用这款功能强大的三维软件,但是再强大的工具也不可能包罗万象,无所不能,所以,通常官方努力在功能和性能平衡之间的同时,也提供第三方扩展软件功能的可能—插件开发。 3DMAX插件开发…

Linux的基本指令(3)

16.cal指令 cal命令可以用来显示公历(阳历)日历。公历是现在国际通用的历法,又称格列历,通称阳历。“阳历”又名“太阳历”,系以地球绕行太阳一周为一年,为西方各国所通用,故又名“西历”。 命…

安防系统智能视频监控中出现画面异常该如何自检?

大家都知道,在当今社会,摄像头无处不在,除了常见的生活与工作场景中,在一些无法人员无法长期驻点场景,如野生动物监测、高空作业监控、高压电缆监控等场景,在这些地方安装摄像头就是为方便日常监控。但是由…

java 反射和注解1-反射详解

反射和注解本就是一家人,注解离不开反射,这里先将反射的写法,本文涉到的注解暂时可以不不用理解 1,创建一个类 public class ReflexUser {public String name;private String namePrivate;protected String nameProtected;Strin…

【自主探索】基于 rrt_exploration 的单个机器人自主探索建图

文章目录 一、rrt_exploration 介绍1、原理2、主要思想3、拟解决的问题4、优缺点 二、安装环境三、安装与运行1、安装2、运行 四、配置自己的机器人1、Robots Network2、Robots frame names in tf3、Robots node and topic names4、Setting up the navigation stack on the rob…

CSS特效018:科技动画,hover后点亮阁楼,拉伸出楼梯

CSS常用示例100专栏目录 本专栏记录的是经常使用的CSS示例与技巧,主要包含CSS布局,CSS特效,CSS花边信息三部分内容。其中CSS布局主要是列出一些常用的CSS布局信息点,CSS特效主要是一些动画示例,CSS花边是描述了一些CSS…