红黑树的插入与验证

news2024/10/7 18:30:59

红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是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:红黑树的实现代码

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

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

相关文章

微信小程序获取手机号报错getPhoneNumber:fail no permission

目录 一、问题描述二、解决方法 一、问题描述 微信小程序调用 API 获取手机号报错: getPhoneNumber:fail no permission二、解决方法 小程序没有认证,需要对小程序进行微信认证。如果是复用公众号资质认证,在公众号关联小程序后&#xff0…

EtherCAT 伺服控制功能块实现

EtherCAT 是运动控制领域主要的通信协议,开源EtherCAT 主站协议栈 IgH 和SOEM 两个项目,IgH 相对更普及一些,但是它是基于Linux 内核的方式,比SOEM更复杂一些。使用IgH 协议栈编写一个应用程序,控制EtherCAT 伺服电机驱…

MIKE水动力笔记19_统计平均潮差

本文目录 前言Step 1 ArcGIS中创建渔网点Step 2 将dfsu数据提取到渔网点Step 3 Python统计平均潮差 前言 日平均潮差(average daily tidal range):日高潮潮高合计之和除以实有高潮个数为日平均高潮潮高,日低潮潮高合计之和除以实…

【漏洞复现】NUUO摄像头存在远程命令执行漏洞

漏洞描述 NUUO摄像头是中国台湾NUUO公司旗下的一款网络视频记录器,该设备存在远程命令执行漏洞,攻击者可利用该漏洞执行任意命令,进而获取服务器的权限。 免责声明 技术文章仅供参考,任何个人和组织使用网络应当遵守宪法法律&…

【C语法学习】25 - strncpy()函数

文章目录 1 函数原型2 参数3 返回值4 使用说明5 示例5.1 示例15.2 示例2 1 函数原型 strncpy():将str指向的字符串的前n个字符拷贝至dest,函数原型如下: char *strncpy(char *dest, const char *src, size_t n);2 参数 strncpy()函数有三个…

linux进程间通信之共享内存(mmap,shm_open)

共享内存,顾名思义就是允许两个不相关的进程访问同一个逻辑内存,共享内存是两个正在运行的进 程之间共享和传递数据的一种非常有效的方式。不同进程之间共享的内存通常为同一段物理内存。进程可以将同一段物理内存连接到他们自己的地址空间中&#xff0c…

信号的机制——信号处理函数的注册

在 Linux 操作系统中,为了响应各种各样的事件,也是定义了非常多的信号。我们可以通过 kill -l 命令,查看所有的信号。 # kill -l1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP6) SIGABRT 7) SIGBUS …

【Spring】加载properties文件

文章目录 在Spring Context中加载properties文件测试总结 在Spring Context中加载properties文件 分为三步&#xff0c;如下图所示&#xff1a; 完整代码&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.…

【Linux】U盘安装的cfg引导文件配置

isolinux.cfg文件 default vesamenu.c32 timeout 600display boot.msg# Clear the screen when exiting the menu, instead of leaving the menu displayed. # For vesamenu, this means the graphical background is still displayed without # the menu itself for as long …

计算机是如何工作的(简单介绍)

目录 一、冯诺依曼体系 二、CPU基本流程工作 逻辑⻔ 电⼦开关——机械继电器(Mechanical Relay) ⻔电路(Gate Circuit) 算术逻辑单元 ALU&#xff08;Arithmetic & Logic Unit&#xff09; 算术单元(ArithmeticUnit) 逻辑单元(Logic Unit) ALU 符号 寄存器(Regis…

java:IDEA中的Scratches and Consoles

背景 IntelliJ IDEA中的Scratches and Consoles是一种临时的文件编辑环境&#xff0c;用于写一些文本内容或者代码片段。 其中&#xff0c;Scratch files拥有完整的运行和debug功能&#xff0c;这些文件需要指定编程语言类型并且指定后缀。 举例&#xff1a;调接口 可以看到…

Unity——URP相机详解

2021版本URP项目下的相机&#xff0c;一般新建一个相机有如下组件 1:Render Type(渲染类型) 有Base和Overlay两种选项&#xff0c;默认是Base选项 Base:主相机使用该种渲染方式&#xff0c;负责渲染场景中的主要图形元素 Overlay&#xff08;叠加&#xff09;:使用了Oveylay的…

Python大数据之linux学习总结——day09_hive函数

hive函数 函数分类标准[重点] 知识点: 原生分类标准: 内置函数 和 用户定义函数(UDF,UDAF,UDTF)分类标准扩大化: 本来&#xff0c;UDF 、UDAF、UDTF这3个标准是针对用户自定义函数分类的&#xff1b; 但是&#xff0c;现在可以将这个分类标准扩大到hive中所有的函数&#…

vue项目如何防范XSS攻击?

场景&#xff1a; 前后端交互的过程中&#xff0c;前端使用v-html或者{{}}渲染时&#xff0c;网页自动执行其恶意代码&#xff0c;如页面弹窗、跳转到钓鱼网站等 解决方案&#xff1a; 先说解决方式&#xff0c;其原理下文解释. 由于我是vue项目所以用的是vue-dompurify-html这…

大数据基础设施搭建 - Hadoop

文章目录 一、下载安装包二、上传压缩包三、解压压缩包四、配置环境变量五、测试Hadoop5.1 测试hadoop命令5.2 测试wordcount案例5.2.1 创建wordcount输入文本信息5.2.2 执行程序5.2.3 查看结果 六、分发压缩包到集群中其他机器6.1 分发压缩包6.2 解压压缩包6.3 配置环境变量 七…

行情分析——加密货币市场大盘走势(11.17)

大机构拉高出货&#xff0c;放心大胆干&#xff0c;笔者手上空单一直拿着&#xff0c;继续等待大饼下跌。 空单策略&#xff1a;入场37000附近 止盈34000-32500 止损39000 以太按照预期回调&#xff0c;继续盈利中&#xff0c;等待继续下跌。没有入场的可以入场&#xff0c;重…

你知道什么是Oracle嘛

文章目录 Oracle数据简介环境准备安装配置安装Oracle设置Oracle开机自启Oracle核心概念创建用户修改用户密码用户授权查看用户 数据备份总结 Oracle数据简介 Oracle Database&#xff0c;又名Oracle RDBMS&#xff0c;或简称Oracle。是甲骨文公司的一款关系数据库管理系统。它…

DDD落地:从腾讯视频DDD重构之路,看DDD极大价值

尼恩说在前面 在40岁老架构师 尼恩的读者交流群(50)中&#xff0c;最近有小伙伴拿到了一线互联网企业如阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试资格&#xff0c;遇到很多很重要的面试题&#xff1a; 谈谈你的DDD落地经验&#xff1f; 谈谈你对DDD的理解&#x…

Python 如何实现 Mediator 中介者设计模式?什么是中介者设计模式?Python 设计模式示例代码

什么是中介者设计模式&#xff1f; 中介者&#xff08;Mediator&#xff09;设计模式是一种行为型设计模式&#xff0c;其主要目的是通过将对象之间的直接交互转变为通过中介者对象进行的间接交互&#xff0c;从而减少对象之间的耦合度。中介者模式通过集中控制对象之间的通信…

【基础算法】筛质数

文章目录 问题描述解决方法朴素筛法线性筛法 问题描述 给定一个正整数 n n n&#xff0c;请你求出 1 ∼ n 1∼n 1∼n 中质数的个数。 输入格式 共一行&#xff0c;包含整数 n。 输出格式 共一行&#xff0c;包含一个整数&#xff0c;表示 1∼n 中质数的个数。 数据范围 …