红黑树():

1. 红黑树:

红黑树从根节点开始的最长的路径不会超过最短路径的2倍。

红黑树的话,他的结点的分布没有我们的AVL树的结点的分布均衡,但是效率也不错,AVL树的结点分布的那么均匀,其实也是在进行了旋转,付出了代价换来的绝对的均衡。

那么红黑树的“红黑树从根节点开始的最长的路径不会超过最短路径的2倍”是怎么被维持的呢?

这两个是我们的红黑树,第一个红黑树的左边全黑的路径就是最短路径,右边一黑一红的是最长的路径,最长路径<=最短路径的2倍;

那我们来数一下我们的这两个红黑树的路径有多少跳呢?

我们的第一个红黑树的路径有8条,第二个有10条。(我们数路径一定要数到空结点,我们的第一个二叉树的10结点下面还有两个空的结点)

这个二叉树不是我们的红黑树,他的最短的路径是最左边的,只有一个黑节点,但是我们的右边的最长的路径有两个黑节点,这就不符合我们的红黑树的规则。

最短和最长路径:

在我们的红黑树里面,全黑的那条路径就是最短的路径,一红一黑的路径是最长的路径;

红黑树没有AVL树那样的绝对的平衡,但是效率也不错,红黑树的旋转次数更少;

2. 红黑树的插入:

我们给红黑树里面插入新节点的时候,我们可以是插入黑色结点,也可以是插入红色结点,但是如果插入黑色结点的话,这个黑色结点影响了这条路径的黑色结点的数量,我们的每条路径的黑色结点的数量可能都会发生变化来保持他们每条路径的黑色结点的数量的相等,这个是很难控制的。

所以我们必须要插入红色结点,当然,如果这个树连根都没有的话,根节点要求是黑结点,我们就插入一个黑结点。

uncle结点的情况的划分:

插入红结点,我们的叔叔结点分为三种情况,我们先看第三种情况:uncle结点存在且为红:

uncle结点存在且为红:

看这个图片,当我们给parent结点的下面插入一个红结点的时候,这时候我们的parent结点和cur结点都是我们的红色的结点,(因为我们的红黑树的规则说明,我们是不能有两个红色结点同时在的)。

常规的处理办法:(变色)

这时候我们看我们的uncle结点,uncle结点是红色结点,这时候我们就把parent结点和uncle结点都变成黑色结点,然后把grandparent结点变成红色结点。(这个就是我们一般变色的方法)。

这时候我们看我们的圈出来的部分就变正常了,然后每条路径的黑色结点的数量也是一样的。但是出现了新的问题,那就是我们的红黑树又出现了两个红色结点连接的情况。

这时候我们就再来一次我们刚才的操作,我们把之前的grandparent结点看成我们的新的cur结点,然后找到新的parent,uncle,grandparent结点。

这时候我们重复刚才的操作,我们看我们的uncle结点,这个时候的话,我们的uncle结点就来到了我们的第二种情况,那就是我们的uncle结点存在且为黑色节点。

我们的第二种的uncle结点存在且为黑色结点的这种情况的话,他只会出现在我们的下面的子树的根节点由黑色变成红色上来的,不然的话,直接插入红色结点的话,uncle结点是不可能为黑色的,不然不符合红黑树的规定。

就好比这种情况,我们给插入一个红色结点后,红色结点cur的叔叔结点uncle直接就是黑色结点,这种情况要是有的话,说明这个红黑树还没有插入结点的时候,这就是一个错误的红黑树。

这种情况只会是我们变了一层以后,继续的往上面去找,然后再往上层的uncle可能会有的情况;

我们往回来看:

uncle结点存在且为黑:

我们现在的叔叔uncle结点现在是黑色结点,这时候我们的刚才的常规的处理的方法就不行了,但是我们还是要想办法来处理他,因为他的最长了路径已经超过了我们的最短路径的长度了。

这时候我们的刚才的常规的变色的处理方法已经不够用了,我们这时候就要使用旋转来解决了。

旋转的话,我们分为单旋和双旋,我们看情况使用这两个旋转方式。

旋转:

//这个是我们的单旋:

我们看这个,这时候我们的uncle结点为黑色结点,我们的两个红色结点相连接,左边的结点比较冗余,我们就进行一个右单旋,parent结点作为我们的根节点,然后grandparent结点变成红色结点作为我们的parent结点的右孩子结点。

//核心是旋转完后我们把parent结点的颜色变成黑色,然后把grandparent结点的颜色变成红色。

下面的是我们的双旋:

旋转的话,我们已经比较熟悉了,我们看上面的,我们要把cur结点作为我们的最上面的结点,我们把cur的左孩子作为parent的右孩子,然后把cur的右孩子变成grandparent的左孩子。

旋转结束以后,我们的cur结点就变成了我们的这颗树的根,这个节点有可能是我们的整棵树的根节点,也有可能只是一个子树的根,但是不管怎样,我们都把cur结点的colour置为BLACK。

然后把grandparent的colour置为RED。        

uncle结点不存在:

当我们的uncle结点不存在的话,我们的cur结点一定是新增的,不可能是由下面的黑结点演变过来的,因为当我们的uncle结点不存在的时候,我们的parent这边的话,他是不能有黑色结点的,所以不可能是演变来的。

这种情况的话,我们是一定要想办法处理掉的,因为后面的路径有两个红结点是相连的,并且的这条路径已经超过了我们的最短路径的长度。 

这时候我们的变色就解决不了这个问题了,我们就要使用旋转来解决;

这个是我们的单旋:

比如上面的这个,我们就使用一个右单旋就可以解决,然后把我们的parent结点变成黑色结点,然后grandparent结点变成红色结点,parent有可能是整颗红黑树的根,也有可能只是一颗普通红黑树的子树的根,但是最后我们都要把它置为黑节点。

下面的是我们的双旋:

这个红黑树没有uncle结点,然后他是左边高的右边高,我们就要使用一个双旋来解决,使用一个左右双旋来解决。(我们之前学习的双旋,我们可以灵巧的记忆一下,我们的cur结点要做到我们的最高的结点,然后cur结点的左孩子给parent的右孩子,cur结点的右孩子做成我们的grandparent的左孩子)。

总结:

这个是我们的uncle结点为红结点,并且parent和uncle结点变成黑节点,grandparent结点变红结点之后就可以处理掉的情况。

这个是我们的uncle结点是空结点的情况,我们需要使用旋转来处理。

这个是我们的uncle结点先是红结点,parent和uncle结点变黑,grandparent结点变红之后,但是我们的红黑树还是有问题的,这时候我们的常规的(parent,uncle,grandparent)变色已经解决不了了,我们就得旋转来解决了。

我们总结一下:我们的上面的三个图片就是对应了我们的uncle结点的三种情况;

红黑树的插入的代码的实现:

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

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

相关文章

【AI智能推荐系统】第六篇:隐私保护与联邦学习在推荐系统中的平衡之道

第六篇:隐私保护与联邦学习在推荐系统中的平衡之道 提示语:🔥 “数据不出域,推荐更精准!深度揭秘腾讯、蚂蚁集团如何用联邦学习打造合规推荐系统,隐私计算技术全景解析与工业级实现方案!” 目录 隐私保护的行业挑战隐私计算技术体系 2.1 联邦学习基础架构2.2 差分隐私…

【Qt/C++】深入理解 Lambda 表达式与 `mutable` 关键字的使用

【Qt/C】深入理解 Lambda 表达式与 mutable 关键字的使用 在 Qt 开发中&#xff0c;我们常常会用到 lambda 表达式来编写简洁的槽函数。今天通过一个实际代码示例&#xff0c;详细讲解 lambda 的语法、变量捕获方式&#xff0c;特别是 mutable 的作用。 示例代码 QPushButto…

记录 ubuntu 安装中文语言出现 software database is broken

搜索出来的结果是 sudo apt-get install language-pack-zh-han* 然而,无效,最后手动安装如下 apt install language-pack-zh-hans apt install language-pack-zh-hans-base apt install language-pack-gnome-zh-hans apt install fonts-arphic-uming apt install libreoffic…

[虚幻官方教程学习笔记]深入理解实时渲染(An In-Depth Look at Real-Time Rendering)

原英文教程地址深入理解实时渲染&#xff08;An In-Depth Look at Real-Time Rendering&#xff09; 文章目录 1.Intro to An In-Depth Look at Real-Time RenderingCPU VS GPUDeferred VS Forward 2. Before Rendering and OcclusionCulling计算的步骤使用console command:fre…

Linux进程间信号

目录 信号入门 生活角度中的信号 技术应用角度的信号 信号的发送与记录 信号处理常见方式概述 产生信号 通过终端按键产生 通过系统函数向进程发信号 由软件条件产生信号 由硬件异常产生信号 阻塞信号 信号其他相关常见概念 在内核中的表示 sigset_t 信号集操作…

Git简介和发展

Git 简介 Git是一个开源的分布式版本控制系统&#xff0c;跨平台&#xff0c;支持Windows、Linux、MacOS。主要是用于项目的版本管理&#xff0c;是由林纳斯托瓦兹(Linux Torvalds)在2005年为Linux内核开发而创建。 起因 在2002年至2005年间&#xff0c;Linux内核开发团队使…

Perspective,数据可视化的超级引擎!

Perspective 是一个强大的交互式数据分析和可视化库&#xff0c;它允许你创建高度可配置的报告、仪表板、笔记本和应用程序。给用户提供了一个新的视角来看待数据。 Stars 数9125Forks 数1217 主要特点 高效流式查询引擎&#xff1a;Perspective使用C编写&#xff0c;并编译为…

MySQL COUNT(*) 查询优化详解!

目录 前言1. COUNT(*) 为什么慢&#xff1f;—— InnoDB 的“计数烦恼” &#x1f914;2. MySQL 执行 COUNT(*) 的方式 (InnoDB)3. COUNT(*) 优化策略&#xff1a;快&#xff01;准&#xff01;狠&#xff01;策略一&#xff1a;利用索引优化带 WHERE 子句的 COUNT(*) (最常见且…

如何在postman使用时间戳

1. 使用 Pre-request Script 动态转换​ 在发送请求前&#xff0c;将日期字符串转为时间戳并存储为环境变量/全局变量。 ​示例代码​ // 将日期字符串&#xff08;如 "2023-10-01"&#xff09;转为时间戳&#xff08;毫秒&#xff09; const dateString "2…

嵌入式学习笔记 - 运算放大器的共模抑制比

一 定义 共模抑制比&#xff08;Common Mode Rejection Ratio, ‌CMRR‌&#xff09;是衡量差分放大器&#xff08;或差分电路&#xff09;抑制共模信号能力的关键指标。它在电子工程中尤为重要&#xff0c;特别是在需要处理微弱信号或对抗环境噪声的场景中。 核心概念 ‌共…

成龙电影中的三菱汽车

帕杰罗、 Lancer Evolution、 3000GT Mitsubishi Lancer Evo ll 1995 附录 Mercedes-Benz 280SL&#xff08;W113&#xff09;&#xff0c;俗称“Pagoda”&#xff08;帕格达&#xff09;

Spring 项目无法连接 MySQL:Nacos 配置误区排查与解决

在开发过程中&#xff0c;我们使用 Nacos 来管理 Spring Boot 项目的配置&#xff0c;其中包括数据库连接配置。然而&#xff0c;在实际操作中&#xff0c;由于一些概念的混淆&#xff0c;我们遇到了一些连接问题。本文将分享我的故障排查过程&#xff0c;帮助大家避免类似的错…

LabVIEW与 IMAQ Vision 机器视觉应用

在工业生产及诸多领域&#xff0c;精确高效的检测至关重要。基于 LabVIEW 与 IMAQ Vision 的机器视觉应用&#xff0c;深入剖析其原理、系统构成、软件设计及优势&#xff0c;为相关领域工程师提供全面技术参考。 ​ 一、技术原理 &#xff08;一&#xff09;机器视觉技术基础…

【STM32 学习笔记】USART串口

注意&#xff1a;在串口助手的接收模式中有文本模式和HEX模式两种模式&#xff0c;那么它们有什么区别&#xff1f;   文本模式和Hex模式是两种不同的文件编辑或浏览模式&#xff0c;不是完全相同的概念。文本模式通常是指以ASCII编码格式表示文本文件的编辑或浏览模式。在文…

【WPS】怎么解决“word的复制表格”粘贴到“excel的单元格”变多行单元格的问题

把 word文档复制表格到这个excel表格上面的话&#xff0c;会出现由单个单元格变成多行单元格的情况。 现在&#xff0c;就这个问题怎么解决&#xff0c;提出了一个方案&#xff0c;就是先查找是什么导致了这个换行&#xff0c;然后再将换行的这个字符进行一个整体的替换&#x…

嵌入式开发面试题详解:STM32 与嵌入式开发核心知识全面解析

一、STM32 共有几种基本时钟信号&#xff1f; 题目 STM32 共有几种基本时钟信号&#xff1f; 解答 STM32 包含 4 种基本时钟信号&#xff0c;分别为 HSI&#xff08;内部高速时钟&#xff09;、HSE&#xff08;外部高速时钟&#xff09;、LSI&#xff08;内部低速时钟&…

华为策略路由

路由策略&#xff1a;是对路由条目进行控制&#xff0c;通告控制路由条目影响报文的转发路径。路由策略为控制平面。 策略路由&#xff1a;是根据报文特征&#xff0c;认为的控制报文从某个即可转发出去&#xff0c;不修改路由表。即策略路由为在转发平面。 路由策略 策略路由…

# YOLOv3:深度学习中的目标检测利器

YOLOv3&#xff1a;深度学习中的目标检测利器 引言 在计算机视觉领域&#xff0c;目标检测是一项核心任务&#xff0c;它涉及到识别图像或视频中的物体&#xff0c;并确定它们的位置。随着深度学习技术的快速发展&#xff0c;目标检测算法也在不断进步。YOLO&#xff08;You …

红黑树删除的实现与四种情况的证明

&#x1f9ed; 学习重点 删除节点的三种情况红黑树如何恢复性质四种修复情况完整可运行的 C 实现 一、红黑树删除的基础理解 红黑树删除比插入复杂得多&#xff0c;因为&#xff1a; 删除的是黑节点可能会破坏“从根到叶子黑节点数相等”的性质。删除红节点无需修复&#xf…

vue配置代理解决前端跨域的问题

文章目录 一、概述二、报错现象三、通过配置代理来解决修改request.js中的baseURL为/api在vite.config.js中增加代理配置 四、参考资料 一、概述 跨域是指由于浏览器的同源策略限制&#xff0c;向不同源(不同协议、不同域名、不同端口)发送ajax请求会失败 二、报错现象 三、…