二叉树之红黑树

news2024/9/25 1:15:56
红黑树的起源

二分查找具有Ologn的时间复杂度,使用二分查找的基础是数据有序。很明显数组可以完成这一条件,但是数组也有缺点,扩容,增加,删除非常不方便。而链表则没有这些缺点,但是链表却不满足随机存取,无法使用二分查找。解决方法便是二叉搜索树,而二叉搜索树的缺点是极端情况下链化又成为了链表。那么可以考虑平衡树,平衡树具有数据分布均匀的特性,但是由于其平衡要求过于严格,进行插入删除会频繁的调整树结构。因此,改善平衡树的特点就出现了红黑树。红黑树具有自平衡(相对平衡,并非平衡树)和有序的特性,很好的完成检索的需求。

红黑树中红黑的含义

红黑是为了保证树的平衡而产生的两种节点的表示。理解红黑之前,先了解另一种树,2-3树。2-3树同样是二叉搜索树的变种,具有名称中的2,3代表两种节点。

2节点:包含一个元素,两个子节点引用,左节点小于父节点,右节点大于父节点

3节点:包含两个元素,三个子节点引用,左边节点小于第一个父节点,中间节点大于第一个小于第二个父节点,右边节点大于第二个父亲节点。

检查2,3节点是否正确的一个有效方法是,节点全部投影到x轴此时为有序序列,如4,5,6和3,5,7,9,10。

image-20221230200019424

两种节点搭配下,保证了任意叶子节点到根节点的距离相同,也就是数据分布均匀而不是链化。二叉搜索树链化的结果是因为插入操作,插入从根节点开始比较,大于走向右边,小于走向左边,走到空则进行插入。而2-3树插入正是改善了插入操作,从而完成相对平衡。

2节点插入一个元素,即成为3节点。

而3节点插入一个元素,需要分类讨论。

  • 一、3节点没有父亲节点,即整棵树只有它一个三节点。那么三节点插入后将进行分解变成二叉搜索树

    image-20221230201906396
  • 二、3节点有一个2节点的父亲节点。3节点插入分解后的得到的父节点融入到2节点成为3节点。

    image-20221230202629068

  • 三、3节点的父亲节点为3节点。子3节点分解得到的父节点,融入到父3节点,父3节点再次分解

    image-20221230204557314

但是将这种思想直接转换为编码实现起来不是很方便,因为需要维护两种类型的节点还需要不断的分解和融合。因此,红黑树出现了,红黑树使用红色黑色的连接作为标记,区分2,3节点,使得代码思想实现更加凝练。

那么红色黑色是怎么标记的呢?在红黑树中,所有节点都是2节点,而3节点是通过连接两个2节点而表示的,连接一个黑色节点和一个红色节点。2-3树的所有叶子节点到树根的路径长度相同,在红黑树中转变为从所有叶子节点到树根的路径长度途径黑色节点的数目相同。因此红黑树并非平衡树,而是黑色节点平衡树。

使用图像表示

image-20221230205937239

image-20221230211057598

红黑树的性质
  • 每个节点要么是红色,要么是黑色
  • 根节点是黑色
  • 每个叶子节点是黑色
  • 两个红节点不直接相连,在2-3树相连会被分解
  • 任意一节点到每个叶子节点的路径包含数量相同的黑节点
红黑树插入操作

插入操作为两步,第一是查找插入位置,第二则是插入后维护红黑树。

依靠三种操作维护红黑树:左旋、右旋、变色。左旋,右旋是为了保持平衡,变色时因为需要保持任意两个红色节点不直接相连。

  • 变色:红黑转变

  • 左旋:以某个节点作为旋转节点,其右子节点变为旋转节点的父亲节点,右子节点的左节点变为旋转节点的右子节点

    image-20221230214656256

  • 右旋:以某个节点作为旋转节点,其左子节点变为旋转节点的父亲节点,左子节点的右节点变为旋转节点的左子节点

    image-20221230214941498

    注意:插入节点为红色节点。因为插入时需要保持黑色平衡,如果为黑色节点则有可能破坏,而红色节点一定不会破坏。

    我们约定如图

    image-20221230220030544

    插入环境分析

  • 空树

    插入节点作为根节点,并且变为黑色

  • 插入节点的key值已经存在

    更新节点值

  • 插入节点的父节点为黑色节点

    直接插入即可

  • 插入节点的父节点为红色节点

    因为一定还存在一个黑色根节点,因此此时一定存在爷爷节点。

    • 叔叔节点存在并且为红色节点

      将F,U节点变为黑色,G变为红色,再设置G节点为当前插入节点。因为此时G节点此时就相当于一个插入节点

      image-20221230222831467

    • 叔叔节点不存在

      • 父节点为爷爷节点的左节点,

        • 插入节点为父节点的左节点(LL红)

          F节点变为黑色,G节点变为红色,对G节点进行右旋

        image-20221230223838314

        • 插入节点为父节点的右节点(LR红)

          对F节点进行左旋,设置F节点为插入节点。此时便转换为LL红

          image-20221230223942224

      • 父节点为爷爷节点的右节点

        • 插入节点为父节点的左节点(RL红)

          对F节点进行右旋,设置F节点为插入节点。此时便转换为RR红

          image-20221230224247464

        • 插入节点为父节点的右节点(RR红)

          F节点变为黑色,G节点变为红色,对G节点进行左旋

          image-20221230224147713

参考资料

https://blog.csdn.net/chen_zhang_yu/article/details/52415077?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title

https://www.bilibili.com/video/BV1UJ411J7CU?p=4&vd_source=f6a308f875296edd5f437b68e0c3253a

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

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

相关文章

第二十七讲:神州路由器PPP CHAP认证的配置

实验拓扑图如下所示 操作步骤: 步骤1:连接网络拓扑图。 步骤2:RouterA基本配置。 Router>enable !进入特权模式 Router#config !进入全局配置模式 …

React jsx 简介与一些语法规则

什么是 Jsx 简单例子&#xff1a; //create virtual dom , single quotes is not needconst VDOM <h1> Hello, React </h1> //appy virtual dom to pageReactDOM.render(VDOM, document.getElementById("test")) //first parameter is virtual dom, …

2022,我们追逐群星,也在追逐AIGC的无尽可能

2022年&#xff0c;是中国人追逐群星的里程碑之年。今年10月31日&#xff0c;中国天宫空间站的第二个科学实验模块——梦天实验舱&#xff0c;搭载长征五号B遥四运载火箭发射升空。随着之后天实验舱成功与之前发射的天和核心舱完成精准对接&#xff0c;中国空间站历史性地完成了…

使用支付宝沙盒 nodejs

1、 进入官网 https://auth.alipay.com/login/index.html 登录 2、下载秘钥转换工具 https://render.alipay.com/p/f/fd-jwq8nu2a/pages/home/index.html 3、生成密钥 注意&#xff0c;此时得到的应用私钥的格式是不对的&#xff0c;应用格式转换转换格式 4、通过3中的应用公钥…

并发编程——2.Java 线程

目录2.Java 线程2.1.创建和运行线程2.1.1.方法一&#xff1a;直接使用 Thread 类2.1.2.方法二&#xff1a;使用 Runnable 接口配合 Thread2.1.3.方法三&#xff1a;使用 FutureTask 配合 Thread2.2.观察多个线程同时运行2.3.查看进程线程的方法2.4.原理之线程运行2.5.线程的常见…

React学习06-React Router 6

React Router 6 概述 React Router 以三个不同的包发布到 npm 上&#xff0c;它们分别为&#xff1a; react-router: 路由的核心库&#xff0c;提供了很多的&#xff1a;组件、钩子。react-router-dom: 包含react-router所有内容&#xff0c;并添加一些专门用于 DOM 的组件&…

Elasticsearch处理表关联关系的N种方式

Elasticsearch处理表关联关系是比较复杂的问题&#xff0c;处理不好会出现性能问题、数据一致性问题等&#xff1b; 今天我们特意分享一下几种方式&#xff0c;对象类型&#xff08;宽表&#xff09;、嵌套类型、父子关联关系、应用端关联&#xff0c;每种方式都有特定的业务需…

CycloneDDS(3)安全Security

本规范定义了符合DDS实现的安全模型和服务插件接口(SPI)架构。DDS安全模型通过DDS实现调用这些SPI来实现。 构成DDS安全模型的三个插件是: 1、身份验证服务插件 提供验证调用DDS操作的应用程序和/或用户身份的方法。包括在参与者之间执行相互身份验证和建立共享秘密的设施…

深度学习模型训练的tricks总结

学习率角度 学习率是一个非常非常重要的超参数&#xff0c;这个参数呢&#xff0c;面对不同规模、不同batch-size、不同优化方式、不同数据集&#xff0c;其最合适的值都是不确定的&#xff0c;我们无法光凭经验来准确地确定lr的值&#xff0c;我们唯一可以做的&#xff0c;就…

从零开始配置vim(30)——DAP的其他配置

很抱歉这么久才来更新这一系列&#xff0c;主要是来新公司还在试用期&#xff0c;我希望在试用期干出点事来&#xff0c;所以摸鱼的时间就少了。加上前面自己阳了休息了一段时间。在想起来更新就过去一个多月了。废话不多说了&#xff0c;让我们开始进入正题。 在前一章&#…

JUC 并发进阶学习(一)

该学习笔记是本人依据相关的学习视频整体汇总&#xff0c;相关的视频学习可以自己去搜看看。 【狂神说Java】JUC并发编程最新版通俗易懂_哔哩哔哩_bilibili 一、什么是JUC 从中就可以看出JUC&#xff0c;实质就是三个包&#xff0c;后面晖详细说明三个包下各个类功能。 java.…

程序员的测试课

git项目地址&#xff1a;GitHub - dreamhead/geektime-todo: Geektime Todo is a demo todo project for Geektime column. 1、实现一个Todo应用 设计规范 1、对于输入参数的检测&#xff0c;由入口部分代码进行处理。如空字符串。 2、Repository 的问题以运行时异常 的形式抛…

Django+Celery+Flower实现异步和定时任务及其监控告警

用Django框架进行web开发非常的快捷方便&#xff0c;但Django框架请求/响应是同步的。但我们在实际项目中经常会碰到一些耗时的不能立即返回请求结果任务如&#xff1a;数据爬取、发邮件等&#xff0c;如果常时间等待对用户体验不是很好&#xff0c;在这种情况下就需要实现异步…

SOFA Weekly|2023 我们一起加油、本周 Contributor QA

SOFA WEEKLY | 每周精选 筛选每周精华问答&#xff0c;同步开源进展欢迎留言互动&#xff5e;SOFAStack&#xff08;Scalable Open Financial Architecture Stack&#xff09;是蚂蚁集团自主研发的金融级云原生架构&#xff0c;包含了构建金融级云原生架构所需的各个组件&#…

RocketMQ 搭建

目录 1、什么是MQ&#xff1f;为什么要用MQ&#xff1f; 2、MQ的优缺点 3、几大MQ产品特点比较 4.RocketMQ在Windows的启动 1.下载RocketMQ 4.7.1版本 2.解压到本地磁盘并配置好JAVA_HOME和ROCKETMQ_HOME 3.修改runserver.cmd 4.启动server 5.修改runbroker.cmd 6.启动…

ROS2 基础概念 服务

ROS2 基础概念 服务1. Services2. 服务类型3. 查找服务4. 服务请求1. Services 服务基于 请求-应答 模型&#xff0c;而不是话题的 发布-订阅 模型 虽然话题允许节点订阅数据流并获得持续更新&#xff0c;但服务 仅在客户端专门调用时提供数据 还是启动海龟及其遥控节点为例&…

[标准库]STM32F103R8T6 点灯以及按键扫描

刚开始学32的时候&#xff0c;选择了基于HAL库进行开发&#xff0c;原因是HAL比较容易上手&#xff0c;像点灯、输出PWM、按键输入这种操作都很快捷。但是到ADCDMA这部分的时候发现&#xff0c;HAL库有一些地方我认为不是很合理和方便。比如DMA中断这部分&#xff0c;ST官方给出…

音视频开发系列--H264编解码总结

一、概述 H264&#xff0c;通常也被称之为H264/AVC&#xff08;或者H.264/MPEG-4 AVC或MPEG-4/H.264 AVC&#xff09; 对摄像头采集的每一帧视频需要进行编码&#xff0c;由于视频中存在空间和时间的冗余&#xff0c;需要用算法来去除这些冗余。H264是专门去除这些冗余的算法…

王者荣耀崩溃解决记录

王者荣耀竟然崩溃了 上周玩王者荣耀&#xff0c;突然就进不去了&#xff0c;点击开始游戏后应用直接就崩溃退出了。 第一反应&#xff0c;肯定是反馈给游戏客服。但是果然腾讯的游戏是找不到真客服的&#xff0c;全部都是机器人处理的&#xff0c;给了我一个毫无用处的官方回…

springboot中配置文件优先级以及分类,这你都可以不会吗?不会赶紧进来学( ̄(∞) ̄)

各位小伙伴大家好呀┗( ▔, ▔ )┛&#xff0c;马上过年了&#xff0c;但是感觉没啥期待的哈哈哈哈哈&#xff0c;现在的年说实话真的挺没劲的呜呜。 言归正传&#xff0c;我们大家在使用springboot时难免会写各种各样的配置信息&#xff0c;比如port&#xff0c;jdbc啊这些&am…