红黑树的插入与验证

红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或
Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路
径会比其他路径长出俩倍
,因而是接近平衡的。

红黑树的性质

最长路径不超过最短路径的2倍

满足以下条件:

1. 每个结点不是红色就是黑色
2. 根节点是黑色的
3. 如果一个节点是红色的,则它的两个孩子结点是黑色的
4. 对于每个结点,从该结点到其所有后代叶结点的简单路径上,均 包含相同数目的黑色结点
5. 每个叶子结点都是黑色的(此处的叶子结点指的是空结点)
 

  • 不能有连续的红结点
  • 所有路径的黑结点个数相同 
  • 根是黑结点

结点定义

红黑树是一个三叉链模型,成员变量包括左右孩子,父亲结点,当前颜色,Value

成员函数有构造函数

为什么对于一个结点,默认设为红色?

如果是新增为黑色结点,会导致左右的黑色结点数变化,不满足个路径的黑色结点数相同。因此需要大量调整。(必须调整)

如果处理为红色,只有当父亲也会红的情况下才需要调整。(非必要调整)

所有将新结点默认为红色就是为了减少调整的次数

结点的插入

红黑树的插入主要有以下几个步骤

  • 一开始为空树,new新结点
  • 不为空,查找合适的插入点(小就往左,大就往右)
  • 提前保存父亲结点,双向链接新结点
  • 调整:
  • 如果父亲也是红,则需要进行调整

颜色的调整

如果父亲是红,就有连续的俩个红色结点,进行调整

调整的话要根据父亲在左边还是右边 ,分成俩大类讨论

首先看父亲在左边


约定:cur为当前节点,p为父节点,g为祖父节点,u为叔叔节点
 

情况一、叔叔存在且为红

这个情况完整来说就是祖父是黑,父亲和叔叔必定是红,cur是红

调整思路:父亲和叔叔着色为黑,祖父着色为红,继续向上调整

因为cur和父亲的颜色为红,那么祖父的颜色是必为,则从祖父开始到根,每条路径的黑色结点为数目为 2(空为黑+祖父是黑),那么将父亲和叔叔修改为黑 ,祖父的结点改为红,则不会影响整条路径的黑色结点数目,调整祖父的结点颜色为红,则会影响影响祖父的父亲。(如果祖父的父亲为红,就存在俩个连续的红,继续调整)

情况二、叔叔存在且为黑或者叔叔不存在

调整思路

1)如果是直线型,即父亲在左,cur也在左

调整方法:

对祖父结点进行右单旋,将p的结点变红,祖父的结点变红

要保证右边的路径黑色结点数目不变,同时左边的红色结点数减少,就要将左边的树旋转到右边,然后进行着色。

由于着色不对uncle结点进行,所以叔叔结点存在与否不做要求。

2)如果是折线形,先对父亲结点进行左单旋,调整为2)的形状,再右单旋,调整颜色。

第二类:

父亲在右边

这一类的方式与父亲在左边基本一致,这里简单说明

1)叔叔存在且为红,父亲叔叔变黑,祖父为红,继续向上调整

2)直线型   叔叔存在且为黑或者叔叔不存在。

3)折线形 

最后一步将根结点暴力调整为黑色

红黑树的验证

1)空树也是红黑树

2)任意一条路径的黑色结点个数都相同

先求出一条路径的黑色结点,再用递归去比较其它的路径

3)不能有连续的红色结点。判断cur和父亲的颜色

关于红黑树的左旋和右旋,可以参考文章:【C++】AVL树-CSDN博客

红黑树的性能

主要对比于AVL树,AVL树相较红黑树更加平衡,建立树的高度比较矮,查找的速度会更快

当时AVL树要进行大量的旋转,会极大消耗时间和空间。而在增删中红黑树性能有优势,相对于实现,红黑树较AVL树简单,因为在实际运用中红黑树更多

 

点我gitee:红黑树的实现代码

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

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

相关文章

搭建大型分布式服务(三十六)SpringBoot 零代码方式整合多个kafka数据源

系列文章目录 文章目录 系列文章目录前言一、本文要点二、开发环境三、创建项目四、测试一下五、小结 前言 让我们来看一下网上是怎样使用SpringBoot整合kafka数据源的,都存在哪些痛点? 痛点一: 手撸kafka配置代码,各种硬编码&a…

一键免费去除视频水印和字幕的AI工具

最近有学员经常让我分享好用的智能抹除视频水印字幕AI工具,今天就给大家分享一个我经常用到的这款工具——腾讯智影,这个平台提供的智能抹除功能,借助这个工具我们可以将视频中不需要的字幕或者水印删除掉。 不过这款工具每天有三次免费次数…

暖阳脚本_ 定制企业软件开发的4个趋势:AI、RPA、云应用、边缘计算

根据 Statista 的统计数据显示,企业级软件市场在全球范围内占据了领先地位,预测到2028年,市场规模将接近3760亿美元。企业应用软件市场的稳健增长,甚至在经济不景气的时候也能持续,这充分表明软件解决方案对于提升企业…

【Linux】第十八站:进程等待

文章目录 一、进程等待的必要性1.进程等待是什么2.进程等待的必要性3.为什么要进程等待呢? 二、进程等待的方法1.问题2.wait3.waitpid4.status的原理5.等待失败6.与status有关的两个宏7.options 一、进程等待的必要性 1.进程等待是什么 通过系统调用wait/waitpid&a…

在listener.ora配置文件中配置listener 1527的监听并且使用tnsnames连接测试

文章目录 前言:一、命令语句实现1、监听介绍2、编辑 listener.ora 文件:寻找配置文件对配置文件进行配置 3、重启监听4、配置TNS 二、图形化界面实现1、listener.ora文件配置2、tnsnames.ora文件配置 三、测试连接 前言: 命令实现和图形化实…

某60区块链安全之51%攻击实战学习记录

区块链安全 文章目录 区块链安全51%攻击实战实验目的实验环境实验工具实验原理攻击过程 51%攻击实战 实验目的 1.理解并掌握区块链基本概念及区块链原理 2.理解区块链分又问题 3.理解掌握区块链51%算力攻击原理与利用 4.找到题目漏洞进行分析并形成利用 实验环境 1.Ubuntu1…

Neo4j安装(Docker中安装Neo4j)

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

Android File Transfer(安卓文件传输工具)

Android File Transfer 是一款安卓文件传输工,它允许在Mac操作系统和Android设备之间进行文件传输。 该软件通过USB连接将文件从Mac电脑传输到连接的Android设备,或者反过来从Android设备传输文件到Mac电脑。这包括照片、视频、音乐、文档和其他文件类型…

搞定这套Python爬虫面试题,大厂Offer拿到手软

文章目录 1、简述Python 的特点和优点2、Python 有哪些数据类型?3、列表和元组的区别4、Python 是如何运行的5、Python 运行速度慢的原因6、面对 Python 慢的问题,有什么解决办法7、描述一下全局解释器锁 GIL8、深拷贝 浅拷贝9、is 和 的区别10、文件读…

python 随机数生成

生成随机整数 使用 randint() 函数可以生成指定范围内的随机整数。 import random # 生成1到10之间的随机整数 random_int random.randint(1, 10) print(random_int) 生成随机浮点数 random() 方法用于生成 0 到 1 之间的随机浮点数。 import random # 生成0到1之间…

【性能测试】Jenkins+Ant+Jmeter自动化框架的搭建思路

前言 前面讲了Jmeter在性能测试中的应用及扩展。随着测试的深入,我们发现在性能测试中也会遇到不少的重复工作。 比如某新兴业务处于上升阶段,需要在每个版本中,对某些新增接口进行性能测试,有时还需要在一天中的不同时段分别进行…

Fe-safe 2023 新功能介绍

Fe-safe的功能增强 3DEXPERIENCE中的更新 疲劳耐久性分析界面集成到结构和力学分析App的UX和数据模型当中,支持在同一个App中和同一个仿真对象中定义分析步、相互作用、边界条件、载荷以及耐久性特征。 增强了焊接疲劳功能,在22xGA中集成了Verity的线…

geoserver的ECQL查询

ECQL Reference — GeoServer 2.24.x User Manual CQL and ECQL — GeoServer 2.24.x User Manual ECQL是CQL的扩展,类似sql查询,比ogc的xml格式简单,可以应用在wfs和wms查询上。 通过可视化页面查看过滤效果,默认视图 主键不会…

23111705[含文档+PPT+源码等]计算机毕业设计SSM框架美妆商城全套电商购物

文章目录 **软件开发环境及开发工具:****项目功能介绍:****论文截图:****实现:****代码片段:** 编程技术交流、源码分享、模板分享、网课教程 🐧裙:776871563 软件开发环境及开发工具&#xff…

C++——map和set

作者:几冬雪来 时间:2023年11月17日 内容:C板块map和set知识讲解 目录 前言: map与set与关联式容器: set底层: set的书写: insert: erase: lower_bound与upper_b…

【139.单词拆分】

目录 一、题目解析二、算法原理三、代码实现 一、题目解析 二、算法原理 三、代码实现 class Solution { public:bool wordBreak(string s, vector<string>& wordDict) {int n s.size();unordered_set<string> hash;for (auto x : wordDict) hash.insert(x);…

目前比较好用的护眼台灯?小白入门最适合的护眼台灯推荐

随着人们对家庭环境艺术的重视&#xff0c;台灯因其摆设在桌案台几上的特殊地位&#xff0c;也要进求特有的装饰效果。家居用台灯开始逐新分流为工艺台灯和书写台灯两类。前者追求外观效果&#xff0c;将发展思路放在材质的创新、造型的求异上&#xff0c;以配合风格多样的家居…

蓝牙耳机仓设计的单芯片解决方案

对于一款优秀的TWS耳机来说&#xff0c;除了耳机本身的音频配置&#xff0c;充电仓也是极为重要的一环。因为与传统有线耳机由设备电池供电不同&#xff0c;缺少了耳机仓&#xff0c;TWS耳机就完全的失去了充电的途径&#xff0c;设备在耗尽电量基本就告别使用了&#xff0c;因…

【GUI】-- 08 JButton、JRadioButton、JCheckBox

GUI编程 03 Swing 3.5 JButton 图片置于按钮之上的JButton&#xff1a; package com.duo.lesson05;import javax.swing.*; import java.awt.*; import java.net.URL;public class JButtonDemo01 extends JFrame {public JButtonDemo01() {Container contentPane getConten…

【Spring】使用三方包进行数据源对象(数据库)管理

在这里使用alibaba的druid来连接数据库&#xff0c;然后再Spring Config下配置数据库 目录 第一步&#xff1a;在pom.xml中导入坐标第二步&#xff1a;在bean中配置连接注 第一步&#xff1a;在pom.xml中导入坐标 在dependencies下写&#xff1a; <dependency><grou…