最容易懂得红黑树

4-10红黑树、HashSet、Map 今日目标 1,了解红黑树 2,知道HashSet保证元素不重复的原理 3,Map集合的基本使用和遍历 4,会使用TreeMap排序 红黑树 红黑树的规则: 1.每一个节点都是红色或者黑色 2.如果一个节点没有子节点,就称为叶子节点(Null),叶子节点都是黑色 3.根节点是黑色 4.对于一个红色节点,它的子节点都是黑色 5.对任意的节点,到其叶子节点的简单路径,包含相同的黑色节点数目。 红黑树的特点: 平衡二叉B树 每一个节点可以是红或黑 红黑树不是高度平衡的,它的平衡是通过"自己的红黑规则". 阅读详情

介绍

红黑树是一个平衡的二叉树,但不是一个完美的平衡二叉树。虽然我们希望一个所有查找都能在~lgN次比较内结束,但是这样在动态插入中保持树的完美平衡代价太高,所以,我们稍微放松逛一下限制,希望找到一个能在对数时间内完成查找的数据结构。这个时候,红黑树站了出来。 
阅读以下需要了解普通二叉树的插入以及删除操作。 
红黑树是在普通二叉树上,对没个节点添加一个颜色属性形成的,同时整个红黑二叉树需要同时满足一下五条性质 
红黑树需要满足的五条性质: 
性质一:节点是红色或者是黑色; 
在树里面的节点不是红色的就是黑色的,没有其他颜色,要不怎么叫红黑树呢,是吧。 
性质二:根节点是黑色; 
根节点总是黑色的。它不能为红。 
性质三:每个叶节点(NIL或空节点)是黑色; 
这个可能有点理解困难,可以看图: 
这里写图片描述 
这个图片就是一个红黑树,NIL节点是个空节点,并且是黑色的。 
性质四:每个红色节点的两个子节点都是黑色的(也就是说不存在两个连续的红色节点); 
就是连续的两个节点不能是连续的红色,连续的两个节点的意思就是父节点与子节点不能是连续的红色。

**性质五:从任一节点到其没个叶节点的所有路径都包含相同数目的黑色节点;**
还是看图:
  • 1
  • 2
  • 3

这里写图片描述 
从根节点到每一个NIL节点的路径中,都包含了相同数量的黑色节点。 
这五条性质约束了红黑树,可以通过数学证明来证明,满足这五条性质的二叉树可以将查找删除维持在对数时间内。 
当我们进行插入或者删除操作时所作的一切操作都是为了调整树使之符合这五条性质。 
下面我们先介绍两个基本操作,旋转。 
旋转的目的是将节点多的一支出让节点给另一个节点少的一支,旋转操作在插入和删除操作中经常会用到,所以要熟记。

下面是左旋和右旋:
左旋:
  • 1
  • 2
  • 3

这里写图片描述 
右旋: 
这里写图片描述

下面讲讲插入

我们先明确一下各节点的叫法 
这里写图片描述

因为要满足红黑树的这五条性质,如果我们插入的是黑色节点,那就违反了性质五,需要进行大规模调整,如果我们插入的是红色节点,那就只有在要插入节点的父节点也是红色的时候违反性质四或者是当插入的节点是根节点时,违反性质二,所以,我们把要插入的节点的颜色变成红色。

下面是可能遇到的插入的几种状况: 
1、当插入的节点是根节点时,直接涂黑即可; 
2、当要插入的节点的父节点是黑色的时候。 
这里写图片描述 
这个时候插入一个红色的节点并没有对这五个性质产生破坏。所以直接插入不用在进行调整操作。

3、如果要插入的节点的父节点是红色且父节点是祖父节点的左支的时候。 
这个要分两种情况,一种是叔叔节点为黑的情况,一种是叔叔节点为红的情况。 
当叔叔为黑时,也分为两种情况,一种是要插入的节点是父节点的左支,另一种是要插入的节点是父亲的右支。 
我们先看一下当要插入的节点是父节点的左支的情况:

这里写图片描述 
这个时候违反了性质四,我们就需要进行调整操作,使之符合性质四,我们可以通过对祖父节点进行右旋同时将祖父节点和父节点的颜色进行互换,这样就变成了: 
这里写图片描述 
经过这样的调整可以符合性质四并且不对其他性质产生破坏。 
当插入的节点是父节点的右支的时候: 
这里写图片描述 
当要插入的节点是父节点的右支的时候,我们可以先对父节点进行左旋,变成如下: 
这里写图片描述 
如果我们把原先的父节点看做是新的要插入的节点,把原先要插入的节点看做是新的父节点,那就变成了当要插入的节点在父节点的左支的情况,对,是的,就是按照当要插入的节点在父节点的左支的情况进行旋转,旋转完之后变成如下: 
这里写图片描述 
4、如果要插入的节点的父节点是红色且父节点是祖父节点的右支的时候; 
这个时候的情况跟情况3所表述的情况是一个镜像,将情况3的左和右互换一下就可以了。 
5、如果要插入的节点的父节点是红色并且叔叔节点也为红色,如下: 
这里写图片描述 
这个时候,只需将父亲节点和叔叔节点涂黑,将祖父节点涂红。

以上就是插入的全部过程。 
下面我们再讲讲删除的操作:

首先你要了解普通二叉树的删除操作: 
1.如果删除的是叶节点,可以直接删除; 
2.如果被删除的元素有一个子节点,可以将子节点直接移到被删除元素的位置; 
3.如果有两个子节点,这时候就可以把被删除元素的右支的最小节点(被删除元素右支的最左边的节点)和被删除元素互换,我们把被删除元素右支的最左边的节点称之为后继节点(后继元素),然后在根据情况1或者情况2进行操作。如图: 
这里写图片描述 
将被删除元素与其右支的最小元素互换,变成如下图所示:

这里写图片描述 
然后再将被删除元素删除:

这里写图片描述

我们下面所称的被删除元素,皆是指已经互换之后的被删除元素。 
加入颜色之后,被删除元素和后继元素互换只是值得互换,并不互换颜色,这个要注意。

下面开始讲一下红黑树删除的规则: 
1.当被删除元素为红时,对五条性质没有什么影响,直接删除。 
2.当被删除元素为黑且为根节点时,直接删除。 
3.当被删除元素为黑,且有一个右子节点为红时,将右子节点涂黑放到被删除元素的位置,如图: 
由 
这里写图片描述 
变成 
这里写图片描述

4.当被删除元素为黑,且兄弟节点为黑,兄弟节点两个孩子也为黑,父节点为红,此时,交换兄弟节点与父节点的颜色;NIL元素是指每个叶节点都有两个空的,颜色为黑的NIL元素,需要他的时候就可以把它看成两个黑元素,不需要的时候可以忽视他。 
如图: 
由 
这里写图片描述 
变成: 
这里写图片描述 
5.当被删除元素为黑、并且为父节点的左支,且兄弟颜色为黑,兄弟的右支为红色,这个时候需要交换兄弟与父亲的颜色,并把父亲涂黑、兄弟的右支涂黑,并以父节点为中心左转。如图: 
由:

这里写图片描述 
变成:

这里写图片描述 
6.当被删除元素为黑、并且为父节点的左支,且兄弟颜色为黑,兄弟的左支为红色,这个时候需要先把兄弟与兄弟的左子节点颜色互换,进行右转,然后就变成了规则5一样了,在按照规则5进行旋转。如图: 
由 
这里写图片描述 
先兄弟与兄弟的左子节点颜色互换,进行右转,变成:

这里写图片描述 
然后在按照规则5进行旋转,变成: 
这里写图片描述 
7.当被删除元素为黑且为父元素的右支时,跟情况5.情况6 互为镜像。 
8.被删除元素为黑且兄弟节点为黑,兄弟节点的孩子为黑,父亲为黑,这个时候需要将兄弟节点变为红,再把父亲看做那个被删除的元素(只是看做,实际上不删除),看看父亲符和哪一条删除规则,进行处理变化如图: 
由: 
这里写图片描述 
变成: 
这里写图片描述 
8.当被删除的元素为黑,且为父元素的左支,兄弟节点为红色的时候,需要交换兄弟节点与父亲结点的颜色,以父亲结点进行左旋,就变成了情况4,在按照情况四进行操作即可,变化如下: 
由:

这里写图片描述 
交换兄弟节点与父亲结点的颜色,以父亲结点进行左旋 变成: 
这里写图片描述 
在按照情况四进行操作,变成: 
这里写图片描述

好了,删除的步骤也讲完,没有讲到的一点就是,在添加删除的时候,时刻要记得更改根元素的颜色为黑。 
这里并没有语言实现,只是讲了一下红黑树的插入删除步骤,你可以根据步骤自己把红黑树实现。

点击这里,照着规则一步一步的构建一个红黑树吧。

最后: 
1.红黑树的实现其实是一个2、3、4树,只是将双节点或者三节点用红色进行了标示,如果你将红色节点放到和它父元素相同的高度,并把它和父元素看做是一个元素,你就会发现,变成了一个高度为lgN的二叉树,这个2.3.4树对红黑树很有启发意义。 
2.上面的步骤其实可以不用死记硬背,是可以推导出来的,因为我们是把一个平衡但通过插入或者删除破坏了平衡的红黑树再次平衡,同过旋转让位,改变红黑颜色,使之符合那五条基本性质。比如遇到删除操作情况四的时候,我们可以把那个删除元素去除,发现左边比右边少一个黑元素,这个时候,怎么办,我们发现兄弟节点的子元素有一个红元素,操作这个不会影响那五条性质,所以我们通过变换颜色,旋转,即可让左右两边的的黑色数目一样。 
3.旋转操作的目的是出让一个元素到另外的地方并且符合二叉树左小右大的性质,交换颜色的目的是为了保持红黑树的那五条性质。 
4.要时刻记得 ,一切的操作都是为了保持那五条性质。

最后的最后,其实还有一种更为简单的红黑二叉树,这个简单的红黑二叉树实际上是一个2.3树,他只允许左节点为红节点,但是性能上肯定是不如这个红黑树。这个简单的红黑二叉树在《算法》第四版有介绍,掌握完之后再看这个简单的红黑二叉树,就会觉着简单 easy。 
最后的最后的最后,一定要尝试着自己推导一下插入删除规则啊,不然经常忘,是睡一觉起来再看就有点懵逼的那种忘。

 

Alphafold2/multimer本地安装避坑指南:从Conda环境配置到GPU加速实战 本文详细介绍了Alphafold2/multimer本地安装的全流程,从Conda环境配置到GPU加速实战,特别针对常见的报错处理提供了解决方案。通过硬件环境检查、依赖安装技巧、OpenMM补丁应用等步骤,帮助研究人员高效部署蛋白质结构预测工具,提升计算效率。 阅读详情

相关推荐

Android wifi源码分析(二) Wifi关闭流程

接着上一篇,这篇说一下Wifi的关闭流程。 由上一篇可以知道,framework层提供的wifi开关接口都是**setWifiEnabled**,只是参数不同而已。*true*表示开启wifi、*false*表示关闭wifi。

奋斗的菜鸟ing 3300

Leetcode - 217存在重复元素(1)

217 存在重复元素 题目描述 给定一个整数数组,判断是否存在重复元素。 如果任何值在数组中出现至少两次,函数返回 true。如果数组中每个元素都不相同,则返回 false。 示例 1: 输入: [1,2,3,1] 输出: true 示例 2: 输入: [1,2,3,4] 输出: false 示例 3: 输入: [1,1,1,3,3,4,3,2,4,2] 输出: true 题目给出的接口是: cl...

RS的博客 342

Windows平台无人机仿真:从零搭建SITL环境与QGC联调

本文详细指导了在Windows平台上从零搭建无人机软件在环(SITL)仿真环境,并与QGroundControl(QGC)进行联调的完整流程。通过使用Cygwin工具链,开发者可以在没有实体硬件的情况下,模拟运行ArduPilot飞控,并通过MAVLink协议连接QGC地面站进行全功能测试,为无人机软件开发提供了一个安全、经济的虚拟沙盒环境。

weixin_29239279的博客 412

红黑树(未完待续)

二叉查找树特点 若任意结点的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若任意结点的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 任意结点的左、右子树也分别为二叉查找树。 没有键值相等的结点(no duplicate nodes)。 红黑树它在二叉查找树的基础上增加了着色和相关的性质使得红黑树相对平衡,从而保证了红黑树的查找、插入、删除的时间复杂度最坏为O(log n)。1

Ellis_hym的博客 585

Unity URP 深度解析:利用Stencil与RenderFeature实现高效遮挡高亮

本文深入解析Unity URP中利用Stencil与RenderFeature实现高效遮挡高亮的技术方案。通过模板缓冲机制和自定义RenderFeature,开发者可以在保持场景完整性的同时,清晰标识被遮挡物体位置,提升游戏体验。文章详细介绍了Shader编写、URP管线配置及性能优化技巧,并提供了常见问题排查方法。

weixin_29012677的博客 480

基于STM32与FPGA Cyclone IV的FSMC高速数据通信实战解析

本文详细解析了基于STM32的FSMC接口与FPGA Cyclone IV实现高速并行数据通信的实战方案。通过将FPGA模拟为SRAM设备,构建了MCU与FPGA之间的高速数据通道,并深入探讨了硬件连接、STM32软件配置、FPGA逻辑设计及性能优化等关键步骤,为图像处理、高速采集等需要大数据量交换的嵌入式应用提供了稳定高效的通信解决方案。

swift5iosmith的博客 295

你了解红黑树么?告诉你一个不一样的红黑树,说点有意思的吧!

先看如下两个问题: 问题1、红黑树的键值可以重复么? 问题2、红黑树必须有键值么? 关于红黑树的介绍网上非常多,红黑树的应用也非常广泛。问一下度娘,她会告诉你各种各样的实现方法,C和C++版本都有,linux内核使用的版本也有。代码都大同小异,就是插入或删除时如何修正,如何搞平衡。很多文章图文并茂、写实而生动,当你在脑海里试图左旋一把,右旋一把搞平衡时,基本也到了精神崩溃的边缘。 如何维护祖孙三代父、祖父、叔叔以及兄弟间的平衡,如何搞好家庭关系,是个头疼的问题。如果把红黑树比作一个族谱的话,可能开始你是高祖

lgsoftlee的博客 1497

某物data魔改与变种算法还原(含加解密Py纯算)

某物data加解密、设备指纹魔改、变异、自定义加密分析与纯算还原

吴秋霖的博客 1281

【算法】最容易懂得的红黑树

红黑树是一个平衡的二叉树,但不是一个完美的平衡二叉树。虽然我们希望一个所有查找都能在~lgN次比较内结束,但是这样在动态插入中保持树的完美平衡代价太高,所以,我们稍微放松逛一下限制,希望找到一个能在对数时间内完成查找的数据结构。这个时候,红黑树站了出来。

clz1314521的专栏 2734

Mac电脑安装burp suite2024版本记录

下载最新版本burpsuitloader-XXX-all.jar,改名为burpsuitloader.jar。目录下,修改vmoptions.txt文件,新增以下内容,如果keygen不是这个名称的话,需要修改。,点击license左侧的copy复制它,然后手动从启动台启动burpsuite。,复制如下命令到终端即可(要加双引号,不然目录中空格会导致命令截断)再复制激活响应信息到burpsuite中即可激活。后续运行burp直接从启动台运行即可。将如下框的信息复制到激活器中。输入后下一步,点击手动激活。

墨痕诉清风的博客 908

LPDDR5 学习笔记05:WCK操作详解

LPDDR5 SDRAM采用双时钟设计,写时钟(WCK)频率为命令时钟(CK)的2倍或4倍,需要通过WCK2CK同步机制解决时钟域对齐问题。该同步操作由带特殊标志位的CAS命令触发,控制器需提供半频WCK脉冲进行状态校准。同步完成后才能执行读写操作,且支持多存储体组同步和WCK常开模式以优化性能。掉电后必须重新执行同步流程,确保时钟域正确对齐。该机制有效解决了高速内存接口的时序挑战,为LPDDR5性能提升提供关键技术支撑。

一只豌豆象的博客 2008

搬:最容易懂得红黑树

最容易懂得红黑树 2017年03月23日 17:00:58 Sun_TTTT 阅读数:86982 标签: 数据结构 二叉树 更多 个人分类: 初学算法 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.youkuaiyun.com/Sun_TTTT/article/details/65445754 介绍 红黑树是一个平衡的二叉树,但不是一个完美的平衡二叉树。虽然我们...

hunter 188

【CloudCompare教程】017:点云快速全局配准

点云数据的配准分为基于特征(特征点、特征线)的拼接和无特征拼接。特征点匹配的方法和全局ICP的方法。特征点的方法通过全局特征匹配达到全局配准,全局ICP的方法通过对变量空间进行搜索的方法达到全局最优解。

智慧空间实验室 3930

最容易懂得红黑树及TreeMap实现

红黑树:https://blog.youkuaiyun.com/v_JULY_v/article/category/774945 TreeMap实现:https://blog.youkuaiyun.com/chenssy/article/details/26668941

zxing的博客 405

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

(转)最容易懂得红黑树

【转载原因:参考理解红黑树】 【转载原文:https://blog.youkuaiyun.com/v_JULY_v/article/details/6105630】

小蚯蚓的博客 214

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

数据结构--搞懂红黑树

  名为搞懂红黑树,所以一些最基本的概念定义就不再赘述,书上和网上一大堆资料,我学习的资料是算法第四版,参考博客http://blog.youkuaiyun.com/u010425776/article/details/60970433,重在理解红黑树这一数据结构。首先要知道的就是红黑树的性质,违反这几条性质就不能称为红黑树,接下来的关于红黑树的操作前提就是不违反这些性质。红黑树的性质:1、每个结点或是红色的...

qq_37891064的博客 318

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

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

红黑树的简单了解

参考: https://www.sohu.com/a/201923614_466939 (漫画算法,什么是红黑树?) https://blog.youkuaiyun.com/sun_tttt/article/details/65445754 (最容易懂得红黑树)   红黑树是一个平衡二叉树。 二叉查找树(BST)具备什么特性? 左子树上所有节点的值小于或等于它的根节点的值 右子树上所有节点的值均...

背着行囊去远方的博客 247

红黑树的剖析

本文参考自http://blog.youkuaiyun.com/sun_tttt/article/details/65445754(最容易懂得红黑树)先对红黑树有一个基本的了解红黑树也是一棵二叉树,而且是一棵自平衡的平衡二叉树(平衡二叉树的任意一个节点的值会大于他左子树所有节点的值,小于它右子树所有节点的值),但是他的自平衡不是严格的控制左右子树高度或节点数之差小于等于1,而是通过他的红和黑的五大性质来实现自...

qiuwenjie123的博客 269

史上最详细的红黑树讲解(一篇文章教你手撕红黑树)

一篇讲解红黑树的文章,图文并茂,详细讲解

Lin5200000的博客 4289

红黑树

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

hc372893308的博客 7635

最详细的对红黑树性质理解

红黑树的性质: 在了解红黑树之前,建议先去了解一下什么是二叉搜索树。 因为红黑树属于二叉搜索树特殊的分支,所以建议先去了解一下二叉搜索树。 二叉搜索树:https://blog.youkuaiyun.com/Falling_stars_/article/details/115536511 红黑树实例图 性质1:每个节点要么是黑色,要么是红色。 性质2:根节点只能是黑色。 性质3:每个叶子节点(NIL)是黑色。 性质4:每个红色节点的两个子节点一定都是黑色。不能有两个红色节点相连。 性质5:任意一节点到每个叶子节点的路

Starry Sea 2100
上一篇: 如何设计大量数据查重
下一篇: Java源码分析:关于 HashMap 1.8 的重大更新
It_BeeCoder
博客等级 码龄10年 967粉丝 238原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值