当前位置: 首页 > news >正文

红黑树插入的旋转变色

红黑树性质:


1.每个结点不是红色就是黑色


2.根节点是黑色的


3.如果一个节点是红色的,则它的两个孩子结点是黑色的(任何路径没有连续的红色节点)


4.对于每个结点,从该结点到其所有后代叶结点的简单路径上,均包含相同数目的黑色结点(每条路径上黑色节点的数量相等)


5.每个叶子结点都是黑色的(此处的叶子结点指的是空结点)


为什么满足上面的性质,红黑树就能保证:其最长路径中节点个数不会超过最短路径节点个数的两倍

下面的符合要求吗?

都不符合条件4

我们插入时的节点都是按红色处理,这样有时会违反条件3,所以要变色and旋转处理

为什么不用黑色呢?

因为插入按黑色走,一定违反条件4,每条路径都要添加黑色,很难处理

下面讲的变色and旋转的关系类似于下面的图

1.p为黑色或nullptr,不用处理

2.p为红色

g一定为黑色,因为p为红色,条件3不能有连续的红色节点,若g为红色,那就违反条件3

_1.u为红色

变色:p和u变黑色,g变红色

这样处理后,原本违反条件3,经过调整后既不违反条件3,也保持了路径上黑色节点个数相同,

不过还要向上调整,看下面的情况

原本g为黑色,经过调整g变红色,那么g的前一个节点为红色也违反了条件3,要继续向上调整

_2.u为nullptr或黑色(都不需要向上调整)

_-1.u为nullptr

旋转and变色

单旋,p为黑色,g为红色,原本违反条件3的即不违反3还保持了黑色节点个数相同,同时也不用向上调整,因为p为根还是黑色,不管p上面的节点是黑色还是红色都不会违反条件3

双旋,c变黑色,g变红色,原本违反条件3的即不违反3还保持了黑色节点个数相同,同时也不用向上调整,因为c为根还是黑色,不管c上面的节点是黑色还是红色都不会违反条件3

_-1.u为黑色

这种情况下c一定为下面调整上来的红色

若c为新插入节点的红色,那么在插入之前就已经不是红黑树了,因为p路径只有一个黑节点,u路径有两个黑色节点,已经违反条件4

就像上面这个图,没有违反条件4,但违反了条件3,这时要旋转and变色

单旋and变色

p为黑色,g为红色,即解决了条件3还保持了条件4

双旋and变色

c变黑色,g变红色,即解决了条件3还保持了条件4。

以上就是红黑树旋转and变色的情况

最后要让根节点的颜色变黑色。

http://www.xdnf.cn/news/596233.html

相关文章:

  • Python |GIF 解析与构建(1):初步解析
  • SOC-ESP32S3部分:7-如何学习ESP32S3-IDF开发
  • Katoolin3 项目介绍:在 Ubuntu 上轻松安装 Kali Linux 工具
  • 【题解-洛谷】P9644 [SNCPC2019] Turn It Off
  • 1.2V超低功耗晶振:物联网设备续航提升的秘密武器
  • ThreadLocal底层原理解析
  • 比较结构的连通性
  • MySQL多线程备份工具mysqlpump详解!
  • 骰子游戏(2023睿抗省赛)
  • C++函数封装和绑定
  • 硬件,软件和进程
  • 过氧化物酶的邻近标记技术(APEX):最灵敏的蛋白互作方法
  • Python生成物理引擎的简单知识图谱
  • SOC-ESP32S3部分:6-任务看门狗
  • 101个α因子#18
  • 【Python/Tkinter】实现程序菜单
  • JVM部分内容
  • mybatisplus公共字段自动填充
  • 1.3 任务Task的说明(Xqt)
  • [Linux文件系统] “我的文件在哪?”FHS标准深度解析与核心目录实用指南
  • MVC和MVVM架构的区别
  • sqli-labs——二次注入
  • 常见的慢SQL优化方式
  • strlen和sizeof,const char *、char * const 和char []区别
  • 第二十九天打卡
  • 网络割接的详细流程和关键点
  • 关于常见日志的几种级别和格式
  • 加工生产调度(Johnson算法)
  • vue vite textarea标签按下Shift+Enter 换行输入,只按Enter则提交的实现思路
  • 准备好,开始构建:由 Elasticsearch 向量数据库驱动的 Red Hat OpenShift AI 应用程序