详细描述红黑树如何左旋、右旋(图文结合)

红黑树

首先要理解二叉查找树

二叉查找树(BST)具备什么特性呢?

  1. 左子树上所有结点的值均小于或等于它的根结点的值。

  2. 右子树上所有结点的值均大于或等于它的根结点的值。

  3. 左、右子树也分别为二叉排序树。

  • 二叉查找树是二分查找的思想,查找所需的最大次数等同于二叉树的高度。
  • 在插入节点的时候也是利用类似的方法,一层一层比较大小,找到合适的插入位置。
  • 如右图,这样虽然满足了二叉查找树的条件,但是这个是瘸腿的二叉查找树,就和链表没有区别了。这是二叉查找树的缺点

  • 解决二叉查找树多次插入新节点而导致的不平衡的方法,就是使用红黑树。
  • 红黑树是一种自平衡的二叉查找树。除了符合二叉查找树的基本特性外,还具有下列的附加特性:
    1. 节点是红色或黑色。
    2. 根节点是黑色
    3. 每个叶子节点都是黑色的空节点(NIL节点)。
    4. 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)
    5. 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。

  • 上面一系列的规则,保证了红黑树的自平衡。红黑树从根到叶子的最长路径不会超过最短路径的2倍
  • 当插入或删除节点的时候,红黑树的规则有可能被打破,这个时候需要进行调整来维持红黑树的规则。

如下图,如果向原红黑树插入值为21的新节点,由于父节点22是红色节点,因此这种情况打破了红黑树的规则4(每个红色节点的两个子节点都是黑色),必须进行调整,使之重新符合红黑树的规则。

  • 调整的方法有两种:
    1. 变色:红变黑,黑变红
    2. 旋转:左旋转和右旋转
变换规则
  • 旋转和颜色变换规则:所有插入的点默认为红色
  1. 变颜色的情况:当前结点的父亲是红色,且它的祖父结点的另一个子结点也是红色(叔叔结点):

    (1)把父节点设为黑色

    (2)把叔叔也设为黑色

    (3)把祖父也就是父亲的父亲设为红色(爷爷)

    (4)把指针定义到祖父结点设为当前要操作的(爷爷)分析的点变换的规则

  2. 旋:当前父结点是红色,叔叔是黑色的时候,且当前的结点是子树。左旋以父节点作为左旋

  3. 旋:当前父结点是红色,叔叔是黑色的时候,且当前的结点是子树。右旋

    (1)把父节点变为黑色

    (2)把祖父结点变为红色(爷爷)

    (3)把祖父结点旋转(爷爷)

变色

为了重新符合红黑树的规则,尝试把红色节点变为黑色,或者把黑色节点变为红色。

  • 下图所表示的是红黑树的一部分,需要注意节点25并非根节点。因为节点21和节点22连续出现了红色,不符合规则4,所以把节点22从红色变成黑色:

  • 但这样并不算完,因为凭空多出的黑色节点打破了规则5,所以发生连锁反应,需要继续把节点25从黑色变成红色:

  • 此时仍然没有结束,因为节点25和节点27又形成了两个连续的红色节点,需要继续把节点27从红色变成黑色:

左旋转
  • 左旋转,就是将S点旋转到根节点,S节点的左边都挂到E节点的右边
  • 就是将要旋转的子结点的左边挂到之前节点E的右边
右旋转

将要旋转的子结点的右边移到之前结点E的左边

举例说明
  1. 首先我们要插入结点6,按照二叉查找树放在如下位置。

  1. 我们发现结点6和结点7是红色的,不满足规则,下一步要判断是变色还是旋转

    当前结点的父亲是红色,且它的祖父结点的另一个子结点也是红色,我们要进行的是变色。把父节点和叔叔设为黑色,把祖父也就是父亲的父亲设为红色(爷爷)

  2. 我们发现结点5和结点12还是不满足规则。变色是说父亲结点和叔叔结点都是红色。不满足,我们用旋转。结点12位于结点5的右子树上。用左旋。

    [图片上传失败...(image-b433f8-1585661664741)]

  3. 对结点5还要进行右旋。

    (1)把父节点变为黑色

    (2)把祖父结点变为红色(爷爷)

    (3)以爷爷结点旋转

  4. 以上。上面的红黑树就没有问题了



 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用IDEA的反编译插件 反编译jar包

反编译插件介绍 安装IDEA后, 一般自带反编译插件, Java Bytecode Decompiler 如果没有可以自己安装下 1.首先找到插件的jar包, 在IDEA安装目录的plugins文件夹下 D:\IntelliJ IDEA 2021.2.2\plugins\java-decompiler\lib 2.运行java命令, 指定插件的jar包目录和你要反编译的ja…

【Hexo + Github 搭建自己的专属博客】

目录 一、前提环境配置 1. 安装Git和NodeJS 2. 安装Hexo 3. 加载主题 4. 修改主题配置 二、搭建博客 1. 将博客部署在GitHub上 2. 写文章并上传 3. 配置一些特效 三、最终成果 ​编辑 一、前提环境配置 1. 安装Git和NodeJS 在 Windows 上使用 Git ,可以…

OpenCV模块熟悉:点云处理相关

1. 显示--VIZ 曾经基于PCL 做过不少点云相关的开发,采样VTK进行有点云显示。后来基于OpenCV做了不少三维重建工作,总是将点云保存下来,然后借助CloudCompare等查看结果。如果能够将VIZ编译进来,预计会提升开发速度。 …

一文搞懂大疆机场kmz航线和图新地球导出的kmz的区别

0序: 近期有用户问“ 把KML文件放到图新后,想转出来KMZ(大疆的机场用的格式)但是转出来的KMZ显示格式不对 ” 之前只是知道大疆的航线规划采用的是kml规范,但具体是什么样并不清楚。就这这个问题把这个事情给弄明白。…

【问题处理】蓝鲸监控-数据断点解决

本文来自腾讯蓝鲸智云社区用户:fadewalk 在问答社区看到有小伙伴在落地蓝鲸的过程中出现监控平台的grafana面板数据断点问题,往往出现这种问题,都比较的头疼。 如果将CMDB(配置管理数据库)比作运维的基石,…

【Leetcode】2580. 统计将重叠区间合并成组的方案数

文章目录 题目思路代码复杂度分析时间复杂度空间复杂度 结果总结 题目 题目链接🔗 给你一个二维整数数组 ranges ,其中 ranges[i] [starti, endi] 表示 starti 到 endi 之间(包括二者)的所有整数都包含在第 i 个区间中。 你需要…

文献阅读笔记(Transformer)

文献阅读笔记(Transformer) 摘要Abstract1、文献阅读1.1 文献题目1.2 文献摘要1.3 研究背景1.4 模型架构1.4.1 Encoder-Decoder1.4.2 注意力机制1.4.3 多头注意力1.4.4 Position-wise Feed-Forward Networks1.4.5 Embeddings and Softmax1.4.6 Positiona…

应对Locked勒索病毒威胁:你的数据安全准备好了吗?

导言: .Locked勒索病毒,作为一种新型的恶意软件,已经在全球范围内引起了广泛的关注。这种病毒通过加密受害者的文件,并要求支付赎金以获取解密密钥,从而实现对受害者的勒索。本文旨在深入解析.Locked勒索病毒的特点、…

Linux逻辑卷管理

一.前言 Linux系统在使用的过程中,数据只会越来越多。如果在硬盘的标准分区创建了文件系统,那么向已有的文件系统增添额外的存储空间是一件头疼的事情。我们只能在同一块物理硬盘上的可用空间范围内调整分区大小。此外硬盘没有存储空间了,就需…

【tingsboard开源平台】环境准备和安装

文章目录 环境准备:1.安装JAVA2.安装maven环境3.安装nodeJS(16.15.1)4.安装git环境5.安装npm依赖关系6.放入文件fetched7.安装IDEA 环境准备: 1.安装JAVA 以安装java11为例,安装tingsboard需要的jdk 下载地址:https://www.oracle.com/java/technologi…

蓝桥杯每日一题(floyd算法)

4074 铁路与公路 如果两个城市之间有铁路t11,公路就会t2>1,没铁路的时候t1>1,公路t21。也就是公路铁路永远都不会相等。我们只需要计算通过公路和铁路从1到n最大的那个即可。 floyd是直接在数组上更新距离。不需要新建dis数组。另外一定要记得把邻接矩阵初始…

2024,听世界用中文讲故事

汉语为桥,联结一段中国缘分;故事为骨,分享一段精彩人生;文化为翼,共筑一个和美地球村。近日,由教育部中外语言交流合作中心主办、中文联盟承办的第二届“汉语桥”全球外国人汉语大会故事会启动。与世界深情…

C#执行命令行

效果图 主要代码方法 private Process p;public List<string> ExecuteCmd(string args){System.Diagnostics.Process p new System.Diagnostics.Process();p.StartInfo.FileName "cmd.exe";p.StartInfo.RedirectStandardInput true;p.StartInfo.RedirectSta…

如何删除Excel中的空白行?这里提供详细步骤

要从数据集中删除所有空白行吗&#xff1f;如果是这样&#xff0c;Microsoft Excel提供自动和手动方法来清除空白行并向上移动数据。下面是如何使用这些方法。 删除空白行时&#xff0c;Excel会删除整行并上移数据&#xff0c;以便数据集中不再有空行。记住&#xff0c;你也可…

数据结构/C++:位图 布隆过滤器

数据结构/C&#xff1a;位图 & 布隆过滤器 位图实现应用 布隆过滤器实现应用 哈希表通过映射关系&#xff0c;实现了O(1)的复杂度来查找数据。相比于其它数据结构&#xff0c;哈希在实践中是一个非常重要的思想&#xff0c;本博客将介绍哈希思想的两大应用&#xff0c;位图…

VS code中安装了git插件,报错无法使用怎么办?

你好&#xff0c;我是云桃桃。 一个希望帮助更多朋友快速入门 WEB 前端程序媛。 1枚程序媛&#xff0c;2年时间从1800到月入过万&#xff0c;工作5年买房。 分享成长心得❤️&#xff0c;和你一起慢慢变富。 后台回复“前端工具”可获取开发工具&#xff0c;持续更新中 后台…

就业班 第二阶段 2401--3.27 day7 shell之流程控制

把昨天的续上 五、变量置换 命令替换 adate %m%d a$(date %m%d) 反引号亦可用$() 代替 变量替换 一 ${parameter:-word} 若 parameter 为空或未设置&#xff0c;则用 word 代替 parameter 进行替换&#xff0c;parameter 的值不变 # a1 # unset b # a${b:-3} # echo $a 3 #…

SSH配置公钥私钥免密登录——windows to linux

SSH配置公钥私钥免密登录——windows to linux SSH的安全机制一、修改远程主机ssh设置二、在windows客户端生成公钥私钥文件三、将客户端公钥追加到远程主机 .ssh/authorized_keys中参考链接 SSH的安全机制 SSH之所以能够保证安全&#xff0c;原因在于它采用了非对称加密技术(…

【网安小白成长之路】2.PHP与MySQL交互

&#x1f42e;博主syst1m 带你 acquire knowledge&#xff01; ✨博客首页——syst1m的博客&#x1f498; &#x1f51e; 《网安小白成长之路(我要变成大佬&#x1f60e;&#xff01;&#xff01;)》真实小白学习历程&#xff0c;手把手带你一起从入门到入狱&#x1f6ad; &…

力扣Lc22--- 459. 重复的子字符串(java版)-2024年3月27日

1.题目描述 2.知识点 &#xff08;1&#xff09; 在Java中&#xff0c;.repeat(i) 是一个字符串方法&#xff0c;用于将原始字符串重复 i 次。 例如&#xff0c;对于字符串 “ab”&#xff0c;使用 .repeat(3) 将会返回 “ababab”。 public class RepeatExample {public s…