首页 > 其他分享 >数据结构之旅:红黑树如何驱动 Set 和 Map

数据结构之旅:红黑树如何驱动 Set 和 Map

时间:2024-12-20 09:57:22浏览次数:9  
标签:Map 结点 Set cur 路径 插入 黑色 红黑树 节点

一、红黑树

1、定义

        红黑树是一种二叉搜索树,在每个节点上增加一个存储位表示结点的颜色(红色或者黑色)。通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保不会有一条路径比其他路径长出两倍,因而这种树是一种接近平衡的。和AVL(平衡二叉搜索树)区别就是不需要严格计算并控制平衡因子使得左右子树之间的高度差不超过1的繁琐过程。

2、满足条件

(1)根节点是黑色。

(2)每个结点不是黑色就是红色

(3)对于每个结点,从该结点到其所有后代叶子结点的简单路径上均包含相同数目的黑色结点。

(4)每个叶子结点都是黑色的(这里的叶子结点和前面不同指的是空结点)。

定理:红黑树中最长路径中的结点的个数不会超过最短路径结点个数的两倍。

3、实现原理

(1)要保证插入结点一定是红色结点,否则会导致结点路径黑色结点个数增加,进而导致其他结点路径的黑色结点数目也要跟着变化。

(2)情景一:插入结点父结点为黑色,则直接插入即可,无需其他处理。

(3)情景二:插入结点cur、cur的父结点p和叔叔结点u均为红色(c,p,u均红)。

这种情况只需要颜色变更即可,首先将g变红,p,u变黑,然后如果g为根节点则直接将g变黑即可,如果g不是根节点,则需要将c结点变为cur结点,g,p,u按照相同规则更新,然后按照上述方法继续调整,直到父节点为黑色或者g为根节点。

(4)情景三:插入结点的父结点p为红色,并且叔叔结点u为黑色或者不存在的情况。

a、当叔叔结点存在且为黑色的情况:其中cur为p的左节点,并且p为g的左节点。下面图中的cur肯定不是插入结点,如果是插入结点的话,原来的二叉树就不满足红黑树的要求了,因此cur是因为下面结点更新颜色而导致变红的(原来是黑色)。

处理方法:将原来红黑树以g为中心向右旋转,然后进行颜色更新(p变黑,g变红)。

b、当叔叔结点不存在的情况:其中cur为p的左节点,并且p为g的左节点。这里的cur和上面不同的是,cur可以为当前插入结点,处理方法和上面一样。

c、当cur结点为parent结点的右结点,并且p为g的左节点。这里的cur不是插入结点原因和a一样。处理方法:首先要以parent为中心向左旋转,然后再以g为中心向右旋转,最后将cur变为黑色,然后g变为红色。

d、当叔叔结点不存在的情况:c结点为p结点的右结点,并且p为g的左节点。处理方式和方案c一样。

另外当p为g的右节点时,和上面一样仍然有四种情况,处理方式:在旋转过程中方向相反即可。

标签:Map,结点,Set,cur,路径,插入,黑色,红黑树,节点
From: https://blog.csdn.net/m0_51738981/article/details/144385321

相关文章

  • 2024年,WinUI3 使用 AccountsSettingsPane 获取微软账户信息
    背景介绍:UWP应用可以使用AccountsSettingsPane调用系统UI实现授权登录功能,相比跳转到网页可以获得更流畅的体验。起动手写代码之前,看文档的介绍非常美好。只需要处理WebAccountProvider和WebTokenRequest对象就能完成授权登录,简直可以说是少有的清晰明了的文档。文档中......
  • Nmap脚本参数详解
    免责声明:使用本教程或工具,用户必须遵守所有适用的法律和法规,并且用户应自行承担所有风险和责任。文章目录一、按脚本分类1.检查身份验证机制2.探测广播行为3.登录爆破4.默认脚本运行5.网络资产发现6.Dos漏洞检测7.漏洞利用8.检测威胁主机9.模糊测试10.侵入......
  • java集合-Map HashMap 源码解析
    hashMap简介HashMap是基于哈希表实现的,每一个元素是一个key-value对,无序,不可重复。HashMap是非线程安全的,只是用于单线程环境下,多线程环境下可以采用concurrent并发包下的concurrentHashMap。HashMap实现了Serializable接口,因此它支持序列化,实现了Cloneable接口,能被克隆。has......
  • Couldn't find a configuration setting named 'registry'
    1. 检查Yarn版本首先,检查你正在使用的Yarn版本。Yarn不同版本的配置方式有所不同,特别是从Yarn1.x升级到Yarn2.x(又称Berry)后,配置的方式发生了变化。可以使用以下命令来检查当前的Yarn版本:yarn--versionYarn1.x:如果你使用的是1.x版本,yarnconfigsetreg......
  • 【数据结构】红黑树
    目录一、概念二、红黑树的插入(一)插入步骤(二)插入的三种情况1、叔叔存在且为红色2、叔叔不存在/存在且为黑色(单旋)3、叔叔不存在/存在且为黑色(双旋)(三)插入代码三、红黑树的平衡检测四、整体代码一、概念    红黑树是对平衡二叉树的改进。平衡二叉树追求极致......
  • Mybatis 升级 Mybatis Plus 重写 Mybatis Plus selectList,如果将参数传到 Mapp.xml
    目录Mybatis写法EntityMapperServiceMapper.xmlTestMybatisPlusEntityMapperServiceMapper.xmlTestMybatis升级MybatisPlus将实体做为条件参数带到Mapp.xml中的自定义SQLMybatis写法通过pagehelper进行分页EntitypublicclassActivityTrackingimplementsSeri......
  • Map集合类和Set集合类介绍和题目演练
    Map集合的介绍、定义和特点Map是一种将键(key)映射到值(value)的对象。在Java中,它是一个接口,有像HashMap、TreeMap等多种实现类。定义:以键值对(key-value)的形式存储数据。键是唯一的,通过键可以快速查找、获取对应的值。例如,存储学生学号(键)和学生姓名(值)的信息集合。特点:键的唯一......
  • Java如何用HaspMap统计次数并排序详解
    java统计单词频率继上一讲Java用PDFTextStripper来解析pdf文件提取文字-ivanlee717-博客园讲了如何接收和解析pdf之后,我们把pdf文件全部转为了String类型的字符串,那么这一讲聊聊怎么去统计每个词出现的频率。正则过滤首先我们需要把单词弄出来,把其他的文字过滤掉。Pattern......
  • Google Maps 抢先体验:解锁 Solar API 的更多覆盖范围和更深入的见解
    随着全球能源需求的上升,住宅太阳能发电成为可持续发展未来的关键因素。要充分发挥太阳能的潜力,可获得且可扩展的解决方案至关重要。CloudAce作为GoogleCloudPremierPartner将为大家同步谷歌地图最新信息:CloudAce-谷歌云|谷歌云全球战略合作伙伴|云服务器据点最多......
  • 【Redis篇】Set和Zset 有序集合基本使用
    目录Set基本命令saddSMEMBERSSISMEMBER SCARD返回值:SPOPSMOVESREM集合间操作交集: 并集:差集:​编辑 内部编码使用场景:Zset有序集合Zset基本命令ZADDZCARD ZCOUNT ZRANGEZREVRANGEZRANGEBYSCOREZPOPMAXBZPOPMAX​编辑ZPOPMINZRANKZREVRANK......