【数据结构】红黑树学习笔记

数据仓库的复用性:设计和构建一个高复用性的数仓 数据仓库的复用性是指在数据仓库的设计和使用过程中,能够实现数据、模型、流程、工具等多个层面的重复利用,减少重复开发,提高开发效率,降低维护成本,并增强灵活性和可扩展性。 阅读详情

点击此链接进行红黑树模拟

前言

所有的红黑树的插入删除操作都与二叉搜索树(BST)的操作类似,只不过红黑树在BST的基础上,多出了维护红黑树性质的操作。而红黑树的性质有以下5条:

  1. 所有的结点要么红,要么黑
  2. 根结点必为黑
  3. 叶子结点(NULL结点)全为黑
  4. 任意两个红色结点必不相邻
  5. 任意结点往下到任意叶子结点的简单路径上所包含的黑点个数相同

插入

(看叔叔结点的脸色)
待插入的结点默认是红色。因为如果是黑色,每插入一个结点,由于路径上的黑色结点数会发生改变,就要进行调整;如果默认是红色的话,只有当出现两个相邻连续的红色结点时,才要进行调整

  • 待插入的结点是树的根结点,则染成黑色
  • 待插入的结点的父结点是黑色,则此时满足红黑树的性质,不用做出任何改变
  • 待插入的结点的父结点是红色(爷结点必然为黑色),此时要考虑其叔叔结点的颜色
    • 如果叔叔结点也是红色,则把父结点和叔叔结点染成黑色,爷结点染成红色;再把当前结点设置为爷结点,继续上述操作,直至根结点,相当于往上递归
    • 如果叔叔结点是黑色,则需要进行旋转操作。如果待插入的结点是父结点的右孩子,则要先进行左旋,转换为是左孩子的情况(如果在右边,则孩子应该旋转至靠右的情况)。然后再父结点为中心,进行右旋,此时父结点会成为这个区域最上面的那一个结点;同时,交换父结点和爷结点的颜色。这样就解决了因为插入导致两个相邻红色结点的情况

删除

回顾BST的删除操作,主要可以归为三类。

  1. 所删除的结点无左右孩子,直接删除即可
  2. 所删除的结点只有左(右)孩子其中一个,删除该结点,但该结点的颜色被其左或右孩子继承(这点在RBT删除操作中非常常见, 一个结点虽然被删除了,但是它的颜色将会在那个位置上保留下来)
  3. 所删除的结点同时拥有左右孩子,则默认找该结点的后继结点来代替这一结点,完成逻辑上的删除,从而转换成删除该后继结点,进而转换成情况一或二

基于以上分析,对于RBT的删除操作,我们只用讨论其无左右孩子,或者只有一个左右孩子的情况。
接着我们讨论如何维护颜色

  • 当删除的结点为黑色且只有一个左右孩子,这里只用讨论其孩子为红色的情况(因为其它情况可以统一归为第三类讨论),孩子继承其父结点的黑色
  • 当删除的结点为红色且无孩子时,直接删除即可,因为不会改变性质
  • 当删除的结点为黑色且无孩子时,或者有一个为黑色的孩子,那么此时该位置会产生一个双黑结点(这是为了维护性质5)

那么我们的问题就进一步转换成了如何消除这个双黑结点(维护性质1)
(看兄弟结点的脸色,一个大的目标就是要把兄弟结点染成黑色,兄弟结点的右孩子染成红色)
首先如果该位置的兄弟结点为红色(父结点必为黑),交换兄弟结点与父结点的颜色,同时左旋。这样就把该位置的兄弟结点变为了黑色,这样就转换成了下面的情况。
如果该位置的兄弟结点为黑色,此时就要考虑它的两个孩子的颜色。根据排列组合,它的两个孩子会出现4种情况,分别为黑红、红红、红黑、黑黑。其中,黑红、红红可以归为一类讨论,所以我们的工作量就是讨论三类情况

  1. 黑黑。解决问题的状态。此时当前结点为双黑结点,兄弟结点也为黑。把当前结点和兄弟结点同时褪掉一层黑色,则当前结点变为普通的黑色结点,兄弟结点变为红色结点。但是为了维护性质5,我们要在父结点上加上一重黑色,如果父亲结点原来为红色,那么加上一重黑色后,当前循环终止;如果父亲结点原来为黑色,则会变为双黑结点。这个操作一句话解释就是:把双黑的情况往上传导,直至根结点
  2. 红黑。这是一种过渡状态(不能最终解决问题)。兄弟结点的右孩子为黑色,我们目标是把其染成红色,具体操作如下:交换兄弟结点与其左孩子的颜色,同时将兄弟结点右旋。这样就转换成了右孩子是红色的情况。
  3. 黑红、红红。解决问题的状态。此时父结点的颜色是未知的,什么颜色都可以,不影响。交换父结点与兄弟结点的颜色,同时将右孩子从红色染成黑色,然后将兄弟结点左旋。这样就成功把双黑结点消成普通黑色结点

能阅读到这里,说明你还是认可我的笔记的,希望对你有用!!

参考资料

  1. AcWing Y总1小时搞定红黑树
  2. 王道408-2023年数据结构考研复习指导
  3. 对红黑树的认识总结-张彦峰ZYF
华为OD机试真题 新系统 9月16号 【统计特殊数字】 华为OD新系统机试真题【统计特殊数字】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【统计特殊数字】。 阅读详情

相关推荐

YOLOv5+Astra Pro Plus深度相机:手把手教你实现实时目标检测(附ROS配置技巧)

本文详细介绍了如何将YOLOv5目标检测算法与Astra Pro Plus深度相机结合,构建实时目标检测系统。内容涵盖从硬件选型、环境搭建、ROS配置到YOLOv5部署与深度信息融合的完整流程,并分享了性能优化、避障算法等实战技巧,帮助开发者在机器人视觉等场景中快速实现智能感知应用。

weixin_28292761的博客 389

理解一下红黑树

定义 红黑树是每个节点都带有颜色属性的二叉查找树,颜色或红色或黑色。在二叉查找树强制一般要求以外,对于任何有效的红黑树我们增加了如下的额外要求: 性质1.每个节点或是红色或是黑色。 性质2. 根节点是黑色。 性质3.所有叶节点都是黑色。(叶子是NUIL节点) 性质4. 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点) 性质5. 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。 下面是一棵简单的红黑树,可以到它就符合上述性质 画一个红黑树 我们规定新插入

Hai-Yang-code的博客 600

基于TI MSPM0的PS2双轴按键摇杆模块ADC+GPIO驱动移植实战

本文详细介绍了在TI MSPM0微控制器上驱动PS2双轴按键摇杆模块的完整实战流程。通过SysConfig图形化工具配置ADC与GPIO引脚,并编写了包含ADC采样、按键检测及数据处理的驱动代码,实现了对摇杆X/Y轴模拟量及按键数字量的稳定读取,为嵌入式控制项目提供了可直接移植的解决方案。

weixin_42465140的博客 83

最简单的红黑树模拟实现

众所周知红黑树是map和set的底层容器,它比AVL树的插入速率更高,且有序。这篇文章将带你手撕红黑树。并以红黑树为底层容器实现模拟实现map和set。

weixin_45897952的博客 1545

抖音直播参数逆向实战:手把手教你用Python获取ttwid和x-bogus(附完整代码)

本文深入解析抖音直播接口的反爬机制,重点剖析核心防护参数ttwid和x-bogus的生成原理与作用。通过Python实战,手把手教你逆向获取ttwid、webid等关键参数,并构建稳定的数据采集方案,为开发者提供企业级数据获取能力。

weixin_29196891的博客 1044

安卓集成华为HMS Scankit实现自定义扫码功能

实现扫码功能 使用的是集成华为扫描的SDK,UI界面借鉴的是谷歌官方的Zxing项目中的自定义view,两者结合实现。 先上效果图: 先在项目根级别(build.gradle)当中配置HMS Core SDK的Maven仓地址。 // 配置HMS Core SDK的Maven仓地址。 maven {url 'https://developer.huawei.com/repo/'} // 配置HMS Core SDK的Maven仓地址。 maven {url 'https://developer.huaw

qq_47625961的博客 5512

【数据结构】手撕红黑树

红黑树和AVL树一样,因其逻辑复杂,面试时现场要求手撕就是纯纯刁难面试者。但某大厂面试官曾要求某些求职者现场手撕红黑树(我赌5毛,让面试官撕,他也撕不出来,而且你家员工上班手搓红黑树啊?),随后求职遭遇被发到网上吐槽,这便有了“手撕红黑树”的梗,也让红黑树成为了知名度最高的数据结构。(话虽如此,对于红黑树的性质、插入思想等概念还是需要掌握的)

学了就忘是正常现象 9492

SAP PS项目计划成本与预算设计:从概念到可用性控制详解

在项目管理中,成本计划与预算管控是决定项目成本能否受控的两个核心概念。成本计划反映“预计花费”,预算是“授权上限”,两者在WBS结构上既相互关联又彼此独立。SAP PS通过计划版本管理不同口径的估算,并借助可用性控制机制对采购申请、采购订单等业务操作进行事前拦截与提示,从而实现从“事后追认”到“事前控制”的转变。理解计划成本作为预算基线、预算作为控制阀门的原理,能够帮助实施顾问和项目管理者合理设计项目财务流程。在大型工程、研发或总包项目中,明确WBS层级、预算对象和检查规则,可有效避免超支风险。围绕SAP

weixin_33146151的博客 359

红黑树实现原理

一、红黑树介绍 1、定义 每个结点或者为黑色或者为红色 根结点为黑色 每个叶结点(实际上就是NULL指针)都是黑色的 如果一个结点是红色的,那么它的两个子节点都是黑色的(也就是说,不能有两个相邻的红色结点) 对于每个结点,从该结点到其所有子孙叶结点的路径中所包含的黑色结点数量必须相同 2、二叉树和AVL树比较 1、二叉树 任意节点左子树不为空,则左子树的值均小于根节点的值. 任意节点右子树不...

老徐的博客 2582

silero-vad 训练自己的数据

silero-vad 训练自己的数据

jacke121的专栏 816

100天精通Python(基础篇)——第22天:eval 函数基础以及危险警告

1. eval()函数的概念 2. eval()函数语法 3. 命名空间 4. 使用实例 1. 基本的数学运算 2. 字符串重复 3. 将字符串转换成列表 4. 将字符串转换成字典 5. 将字符串转成元祖 6. 与其它函数结合使用 7. globals参数案例 8. locals参数案例 5. eval函数的危险之处(重中之中)

努力让自己发光,对的人才能迎着光而来 15万+

手撕红黑树(Red-Black Tree)

红黑树 (C++实现)

林慢慢的博客 3601

【C语言】一文带你拿捏分支和循环语句(一万字详细讲解)

if/switch语句、while/fo/do...while循环语句、goto语句详解

StackFrame 1233

数据结构 - 学习笔记 - 红黑树

所有结点非红即黑。(插入新结点默认红色,然后再按需调整)根结点必需是黑色。叶结点必需是黑色。叶结点是指最末端的空结点。通常在代码中直接用 null 表示,不会创建实际结点。红结点的子结点必需是黑。有两棵或无子树。(不能有连续的两个红结点)任意结点到叶节点经过的黑结点数量相同。(别忘记叶结点也是黑色结点 )红黑树是234树的一种实现,所以学习红黑树前,先看红黑树前传——234树。它是一种自平衡的二叉查找树。2.1.二叉查找树的左子树所有结点值都=父。2.2.

灵台方寸山斜月三星洞 2569

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

数据结构学习笔记——红黑树

一:基本概念红黑树(Red Black Tree):是一棵二叉搜索树,树中的每一个节点是红色或者黑色。扩充二叉树:在二叉树中出现空子树的位置增加空树叶的二叉树,增加的空树叶叫外部节点。红黑树的其他性质可以用扩充二叉树来说明:1.根结点和所有外部节点都是黑色的;2.在根结点至外部节点的路径上,没有连续的两个红色节点;3.从一个节点到它所能到达的外部节点的路径上的黑色节点数都相同。二:红黑树的旋转在插...

zhao_h的博客 378

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

【Java数据结构】红黑树学习笔记

【Java数据结构】红黑树概述二分查找法二叉树红黑树 概述 因为之前有准备写Java.util中的clloection集合类,最常见的就是List和Map,List中的ArrayList和LInkedList都已经总结完了,准备总结HashMap,jdk8中的HashMap底层结构是数组+单向链表+红黑树,关于红黑树的相关知识曾了解过,但也忘得差不多了,所以准备过一遍红黑树相关的知识,再总结HashMap的源码。 二分查找法 二叉树 红黑树 ...

weixin_43988801的博客 348

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

数据结构 - 学习笔记 - 红黑树前传——234树

在学习红黑树前需要先了解234树。因为红黑树就是由234树演变出来的。了解了234树才能明白红黑树颜色变化的底层逻辑。明明是包含123个结点,为什么不叫123树而叫234树。因为树的特性就是分叉,结点的命名是按它的分叉能力来的。n结点就是能分n个叉的结点。(这怎么感觉跟制动有异曲同工之妙啊。234树就是4阶B树。也就是允许结点最多有4个子结点的平衡多路查找树。234树是倒着长的。新元素插入到叶子,然后触发分裂向上提升元素成父级。可以将红黑树看作是234树的一个具体实现。一颗234树可以对应多个。

灵台方寸山斜月三星洞 2642

数据结构学习笔记 - 红黑树

红黑树 一般讲到平衡二叉查找树, 都会拿红黑树作为例子, 工程中, 很多用到平衡二叉查找树的地方都会用到红黑树 但凡用到动态插入, 删除, 查找数据的场景, 都可以用到它, 不过自己实现起来难度有点高 什么是平衡二叉查找树 平衡二叉树定义: 二叉树中任意一个节点的左右子树的高度相差不能大于1. 完全二叉树, 满二叉树, 都是平衡二叉树 平衡二叉查找树不仅满足上面定义, 还满足二叉查找树的特点 最先被发明的平衡二叉查找树是AVL树 但很多平衡二叉查找树并没有严格符合上面的定义, 比如红黑树 设计初衷是解决,

Mr.W的博客 169

408数据结构学习笔记——二叉排序树、二叉平衡树、红黑树

1.二叉排序树 2.平衡二叉树 3.红黑树 4.王道课后题

JiangNan_1002的博客 6164

数据结构 红黑树 学习笔记

数据结构 红黑树的添加 删除 学习笔记

van9527的博客 273

学习笔记之数据结构的二叉树与红黑树

1 二叉树 特点: 一个节点的左子节点的关键字值小于这个节点,右子节点的关键字值大于或等于这个父节点 删除节点: 三种情况 1.该节点没有子节点 将父节点指向它的引用设置为null 2.该节点有一个子节点 父节点指向它的引用和它指向子节点的引用 3.该节点有两个子节点 注:二叉搜索树是按照关键升序排列,对每一个关键字来说,比它...

sskai163的博客 341

数据结构与算法学习笔记7:红黑树

数据结构与算法学习笔记7:红黑树红黑树特点红黑树的创建查找(节点添加的位置)节点添加(新来节点是红色的)代码删除分析代码应用红黑树优势红黑树在Linux底层应用:Linux中的epoll模型 红黑树 AVL 绝对平衡(高度差) 红黑树 相对平衡(颜色) 红黑树是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能。它虽然是复杂的,但它的最坏情况运行时间也是非常良好的,并且在实践中是高效的: 可以在O(log2n)O(log_2n)O(log2​n)时间内做查找,插入和删除,这里的

h0327x的博客 220

2021-10-11-《C#数据结构与算法》-学习笔记-P46-P52 2-3查找树与红黑树

总结 1.视频资源P46-P48: https://www.bilibili.com/video/BV1gE41157pC?p=8&spm_id_from=pageDriver 2.学习内容: 2021-10-11 1)2-3查找树 P46; 2)红黑树性质 P47; 3)红黑树中添加结点-左旋转 P48。 具体内容 2021-10-11 P46 2-3查找树 1、二叉查找树与红黑树; 2、2-3查找树性质; 3、2-3查找树中添加结点; 4、2-3查找树的生长轨迹; 5、2-3查找树缺点。

weixin_49079904的博客 321

C#数据结构与算法学习笔记 红黑树

1.什么是2-3数 2.什么是红黑树 3.左旋转 4.颜色反转和右旋转 5.添加、包含、最大高度

Mr_Tfos的博客 321

数据结构学习笔记:红黑树

红黑树(Red Black Tree) 是一种自平衡二叉查找树,红黑树和AVL树类似,都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能。它可以在O(log n)时间内做查找,插入和删除,这里的n 是树中元素的数目。性质红黑树是每个节点都带有颜色属性的二叉查找树,颜色为红色或黑色。在二叉查找树强制一般要求以外,对于任何有效的红黑树我们增加了如下的额外要求: 节点是红色

(づ。◕‿‿◕。)づgigi奋斗在前端和刷题中╮(╯﹏╰)╭ 868

数据结构(邓俊辉)学习笔记】高级搜索树03——红黑树

学习下红黑树的原理和实现

weixin_44399845的博客 1000
上一篇: 【Compile】递归下降语法分析(C++)
下一篇: 【Compile】表驱动LL(1)语法分析(C++)
CodeSlogan
博客等级 码龄6年 4227粉丝 130原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

CodeSlogan

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

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

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

打赏作者

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

抵扣说明:

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

余额充值