红黑树笔记

news2024/11/26 23:51:11

2-3树 -> 左倾红黑树

红黑树实际上是2-3树的一种基于BST的实现。普通二叉搜索树(BST)中的每一个节点,只有一个键,两条链接(两个子节点),这种节点被称为2节点。2-3树中,引入了一个3节点的概念,它含有两个键,三条链接。左链接指向的键都小于该节点,中链接指向的键介于该节点的两个键之间,右链接指向的键都大于该节点。同理我们可以构造出4节点、5节点,在这样的树中,空节点到根节点的距离都是相同的,这样的树就是一棵平衡的2-3搜索树。

由于2-3树的新节点插入不是直接插入子节点,而是直接插入临近节点位置,然后判断是否需要拆分节点,拆分后向上合并节点,因此2-3树的生长方向是自底向上的,这也就保证了2-3树始终是平衡的。即使连续插入有序列表,生成出来的2-3树依然是高度平衡的。

节点的分解都在树的局部进行,因此分解操作不会影响树的平衡性和有序性。

2-3树实现的难点在于,它需要额外的数据类型来维护3节点,以及处理失衡的结构时,对不同类型的节点进行频繁的转换。

一种简化2-3树的思路

一种简化2-3树的思路是用2节点替换3节点,同时又能保持树的平衡性。

一棵标准2-3树

拆分3节点并标记左侧节点为红色

就得到了一棵红黑树(左倾红黑树)

左倾红黑树

为了保证红黑树跟2-3树完全等价,我们需要以下定义:

  • 红链接都是左链接
  • 任何节点不会同时和2个红色节点相连

满足这2个条件的红黑树被称为左倾红黑树,它的实现相对标准红黑树更为简单。

红黑树的五条性质

  • 节点是黑色或红色
  • 根节点只能是黑色
  • 所有叶子节点都是黑色(NIL)
  • 不能出现连续的红色节点
  • 任意节点到其每个叶子节点的每条路径都包含相同数量的黑色节点

若根节点为2节点,那其本身就是黑色节点,若根节点为3节点,那么黑色节点就是其中的较大元素,因此根节点总是黑色。

根据2-3树转化到红黑树的过程就可以很直观地看到,不会出现连续的红色节点,即使是基于2-3-4树实现的红黑树,4节点在红黑树中也是表现为一个黑色节点带两个红色子节点,因此一定不会出现连续的红色节点。

根据2-3树转化到红黑树的过程,可以看出红色节点总是依附黑色父节点而存在,因此在红黑树中只有黑色节点才真正贡献高度。2-3树本身具备高度平衡的特点,反映到红黑树中就是黑色节点完美平衡

什么是4节点?

从结构上来看,简单理解,一个黑色节点带两个红色子节点就可以认为是一个4节点。下图是4节点分解的完整过程。

插入操作的3种情况

左倾红黑树的插入有三种可能的情况

情况1(出现左右两个红色子节点)

插入前黑父左边是红色节点,待插入节点比黑父大,插在了黑父的右边,此时出现右倾红节点。

注意,这种情况对应着2-3树中出现了临时4节点,我们在2-3树中的处理是将这个临时4节点分裂,左右元素各自形成一个2节点,中间元素上升到上层跟父节点结合。所以,我们在红黑树中的动作是,将原本红色的左右儿子染黑(左右分裂),将黑父染红(等待上升结合)。

补充下特殊场景的处理,假设节点9也是红节点,那么就要先对节点9进行左旋,然后对左旋后的节点15的父节点(假设为节点X)进行右旋,并修改节点15为黑色,修改节点X为红色。然后我们就会发现又回到了场景一,之后继续按照情况1的规则继续处理即可。

情况2(左侧出现连续红色子节点)

待插入节点比红父小,且红父本身就是左倾红节点,也就是说,两个红节点靠在左边形成了连续的红节点。

这种情况我们需要用两步来调整。由于我们插入的是红色节点,其实不会破坏黑色完美平衡,所以要注意的是在旋转和染色的过程种继续保持这种完美黑色平衡
首先对红父的父亲进行一次右旋,这次右旋不会破坏黑色平衡,但是也没有解决连续红色的问题。
接下来将12所在节点与15所在节点交换颜色,这样的目的是为了消除连续红色,并且这个操作依旧维持了黑色平衡。现在我们已经得到了情况1的场景,直接按情况1处理即可。

情况3(出现红色右节点)

待插入元素比红父大,且红父自身就是左倾。也就是说插入的这个节点形成了一个右倾的红色节点,对右倾的处理很简单,将红父进行一次左旋,就能使得右倾红节点变为左倾,现在出现了连续的左倾红节点,直接按情况2处理即可。

在插入时,可以体会到左倾红黑树对于左倾的限制带来的好处,因为在原树符合红黑树定义的情况下,如果父亲是红的,那么它一定左倾,同时也不用考虑可能存在的右倾兄弟(如果有,那说明原树不满足红黑树定义)。

这种限制消除了很多需要考虑的场景,让插入变得更加简单。

删除操作

删除节点要保证2点:不能破坏树的有序性、不能破坏树的平衡性。流程上可以分为2步,第一步向下递归,对红黑树进行预调整,删除目标节点。第二步向上回溯,修复预调整阶段被破坏的红黑树。

如果要删除的节点是红黑树中的中间节点,那么删除节点后树的调整会非常复杂,因为要同时考虑父节点与子节点的情况。有一种简单的方法是,需要删除某个节点时,不直接删除该节点,而是改为删除它的前驱或后继节点,把删除节点的值直接赋值给当前要删除的节点。假设改为删除它的后继节点,那么情况就可以简化为删除叶子节点或者只包含一个子节点的节点,这可以大大简化后续需要执行的操作。

向下递归

我们从根节点出发,基于2-3树的预合并策略对红黑树进行调整。具体的做法是,每次都保证当前的节点是2-3树中的非2节点,如果当前节点已经是非2节点,那么直接跳过;如果当前节点是2节点,那么根据兄弟节点的状况来进行调整:

  • 如果兄弟是2节点,那么从父节点借一个元素给当前节点,然后与兄弟节点一起形成一个临时4节点。
  • 如果兄弟是非2节点,那么兄弟上升一个元素到父节点,同时父节点下降一个元素到当前节点,使得当前节点成为一个3节点。

这样的策略能够保证最后走到待删除节点的时候,它一定是一个非2节点,我们可以直接将其元素删除。

向上回溯

接下来要考虑的是修复工作,由于红黑树定义的限制,我们在调整的过程中出现了一些本不该存在的红色右倾节点(因为生成了概念模型中的临时4节点),于是我们顺着搜索的方向向上回溯,如果遇到当前节点具备右倾的红色儿子,那么对当前节点进行一次左旋,这时原本的右儿子会来到当前节点的位置,然后将右儿子与当前节点交换颜色,我们就将右倾红节点修复成了左倾红节点,同时我们并没有破坏黑色节点的平衡。

记录哪些笔记?能够让人很久以后依然能够比较容易看懂?

  1. 红黑树实际上是2-3树的一种实现
  2. 介绍红黑树的5条定义
  3. 能不能不介绍左旋右旋?
  4. 介绍下什么是『临时4节点』
  5. 直接写插入和删除的场景?

2-3-4树 -> 标准红黑树

为什么不直接实现2-3树或者2-3-4树?

因为直接实现太过复杂,需要处理不同节点间的转换,分解4节点和5节点需要处理的情况太多,需要考虑4节点的位置情况,需要考虑父节点是2节点还是3节点,4节点是左节点、右节点还是中间节点等等,而且实现后需要大量额外的开销,实际性能并不理想,因此实际应用很少。

参考链接

红黑树-维基百科

红黑树_百度百科

《算法》(第4版) - chapter 3.3 红黑树_哔哩哔哩_bilibili

图解:什么是红黑树? - 知乎

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

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

相关文章

利用二叉检索树将文章中的单词建立索引(正则表达式)

知识储备 链接: 【二叉检索树的实现——增删改查、读取命令文件、将结果写入新文件】 1、正则表达式的处理 (1)r’前缀的作用 r’前缀的用于定义原始字符串,特点是不会处理反斜杠\作为转义字符 (2)正则表达式中元…

335GB,台北地区倾斜摄影OSGB数据V0.2版介绍!

前几天发布了台北地区倾斜摄影OSGB数据第一个版本(139GB,台北倾斜摄影OSGB数据V0.1版),虽然数据还是一个半成品,完全没想到热度很高,很多读者对这份数据都有比较浓厚的兴趣,在这里首先感谢各位读者的大力支持与鼓励,给了我持续更新…

Arm Linux 移植 Air724UG 4G模块-USB方式

目录 一、开发环境二、连接方式三、4G模组的 VID 和 PID四、Linux kernel 的配置五、ppp的编译六、测试 一、开发环境 开发板:NUC980 iot开发板 4G模块:银尔达 Core-Air724 二、连接方式 micro usb线,一端连接4G模组,一端连接N…

亚马逊云科技AWS将推出数据工程师全新认证(有资料)

AWS认证体系最近更新,在原有12张的基础上,将在2023年11月27日添加第13张,数据工程师助理级认证(Data Engineer Associate),并且在2024/1/12前半价(省75刀=544人民币。 原有的数据分析专家级认证(Data Analytics Specia…

Spark-机器学习(7)分类学习之决策树

在之前的文章中,我们学习了分类学习之支持向量机,并带来简单案例,学习用法。想了解的朋友可以查看这篇文章。同时,希望我的文章能帮助到你,如果觉得我的文章写的不错,请留下你宝贵的点赞,谢谢。…

java-链表排序

需求 思路 排序:讲所有的值都取出来,存储到ArrayList中,然后排序,将排序之后的元素依次使用add方法添加到自定义链表合并排序:先合并,然后调用刚才写的排序算法合并:将表一的头结点作为新链表的…

kerberos-hive-dbeaver问题总结

一、kerberos安装windows客户端 1、官方下载地址 http://web.mit.edu/kerberos/dist/ 2、环境变量配置 下载msi安装包,无需重启计算机,调整环境变量在jdk的前面,尽量靠前,因为jdk也带了kinit、klist等命令 C:\Program Files\…

[动画+注释详解]数据结构 - 直接插入排序

一. 直接插入排序算法的实现 1.1 基本思想 直接插入排序(Straight Insertion Sort)是一种简单直观的排序算法,它的基本思想是将一个待排序的记录插入到已经排序好的有序表中,从而得到一个新的、记录数增加1的有序表。 实际中&am…

Oracle对空值(NULL)的 聚合函数 排序

除count之外sum、avg、max、min都为null,count为0 Null 不支持加减乘除,大小比较,相等比较,否则只能为空;只能用‘is [not] null’来进行判断; Max等聚合函数会自动“过滤null” null排序默认最大&#xf…

特别的时钟特别的倒计时

念念不忘的歌曲&#xff1a;Thats Why You Go Away <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title&…

线上线下交友社区系统,支持打包小程序/公众号/H5,源码交付!

上网交友的好处有很多&#xff0c;以下是一些主要的好处&#xff1a; 1. 拓展人际关系&#xff1a;通过上网交友可以认识更多的人&#xff0c;拓展自己的社交圈。这有助于扩大自己的视野、增加人生经验和开阔心胸。 2. 找到志同道合的朋友&#xff1a;在网络上&#xff0c;我们…

《面向云计算的零信任体系第1部分:总体架构》行业标准正式发布

中华人民共和国工业和信息化部公告2024年第4号文件正式发布行业标准&#xff1a;YD/T 4598.1-2024《面向云计算的零信任体系 第1部分&#xff1a;总体架构》&#xff08;后简称“总体架构”&#xff09;&#xff0c;并于2024年7月1日正式施行。 该标准由中国信通院牵头&#xf…

装饰器模式、代理模式、适配器模式对比

装饰器模式、代理模式和适配器模式都是结构型设计模式&#xff0c;它们的主要目标都是将将类或对象按某种布局组成更大的结构&#xff0c;使得程序结构更加清晰。这里将装饰器模式、代理模式和适配器模式进行比较&#xff0c;主要是因为三个设计模式的类图结构相似度较高、且功…

如何讲好ppt演讲技巧(4篇)

如何讲好ppt演讲技巧&#xff08;4篇&#xff09; 如何讲好PPT演讲技巧&#xff08;四篇&#xff09; **篇&#xff1a;精心准备&#xff0c;奠定演讲基础 一个成功的PPT演讲&#xff0c;离不开精心的准备。首先&#xff0c;要确定演讲的主题和目标&#xff0c;确保演讲内容清…

SpringMVC进阶(自定义拦截器以及异常处理)

文章目录 1.自定义拦截器1.基本介绍1.说明2.自定义拦截器的三个方法3.流程图 2.快速入门1.Myinterceptor01.java2.FurnHandler.java3.springDispatcherServlet-servlet.xml配置拦截器4.单元测试 3.拦截特定路径1.拦截指定路径2.通配符配置路径 4.细节说明5.多个拦截器1.执行流程…

七彩虹(Colorful)隐星P16 2023款笔记本电脑原装出厂Win11系统镜像下载 带建Recovery一键还原功能

七彩虹原厂Windows预装OEM专用系统&#xff0c;恢复出厂开箱状态一模一样 适用型号&#xff1a;隐星P16 23 链接&#xff1a;https://pan.baidu.com/s/1Ig5MQMiC8k4VSuCOZRQHUw?pwdak5l 提取码&#xff1a;ak5l 原厂W11系统自带所有驱动、出厂时自带的主题与专用壁纸、系…

第 4 篇 : Netty客户端互发图片和音/视频

说明 因为图片和音/视频不能确定其具体大小, 故引入MinIO。客户端之间只发送消息, 通过上传/下载来获取额外信息 1. MinIO搭建(参考前面文章), 并启动 2. 登录MinIO创建3个Bucket: image、voice、video 3. 客户端改造 3.1 修改 pom.xml <?xml version"1.0" …

浅谈OpenCV 粗略计算工件轮廓面积和外接圆直径(Emgu.CV)

前言 最近领导在做库房工具管理这块的功能&#xff0c;希望能集成OpenCV 粗略的计算出工具的长度&#xff0c;以方便用户再归还工具的时候&#xff0c;提示用户该放在那种尺寸的盒子里面&#xff0c;这便是这篇文章的由来。 我们的系统是基于.net开发的&#xff0c;所以采用的是…

Memory augment is All You Need for image restoration 论文翻译

目录 一.介绍 二.实际工作 A.图像阴影去除 B.图像去雨 C.存储模块的开发 三.网络结构 A.内存扩充 B.损失函数设计 四.实验 A.与最先进方法的比较 B.MemoryNet消融研究 五.结论 CVPR2023 MemoryNet 记忆增强是图像恢复所需要的一切 论文地址https://arxiv.org/abs/…

就业班 第三阶段(nginx) 2401--4.26 day5 nginx5 nginx https部署实战

三、HTTPS 基本原理 1、https 介绍 HTTPS&#xff08;全称&#xff1a;HyperText Transfer Protocol over Secure Socket Layer&#xff09;&#xff0c;其实 HTTPS 并不是一个新鲜协议&#xff0c;Google 很早就开始启用了&#xff0c;初衷是为了保证数据安全。 近些年&…