红黑树的插入与验证

红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是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.rhkb.cn/news/196024.html

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

相关文章

二、程序员指南:数据平面开发套件

MEMPOOL库 内存池是固定大小对象的分配器。在DPDK中,它由名称标识,并使用环形结构来存储空闲对象。它提供一些其他可选服务,例如每个核心的对象缓存和一个对齐辅助工具,以确保对象填充以将它们均匀分布在所有DRAM或DDR3通道上。 …

【mysql】1153 - Got a packet bigger than ‘max_allowed_packet‘ bytes

执行mysql 语句出现:1153 - Got a packet bigger than max_allowed_packet bytes; 1153-得到一个大于“max_allowed_packet”字节的数据包。 数据包太大了怎么办。该配置吧。 查看max_allowed_packet show global variables like max_allowed_packet;…

asp.net 学校资源信息管理系统VS开发sqlserver数据库web结构c#编程计算机网页项目

一、源码特点 asp.net 学校资源信息管理系统 是一套完善的web设计管理系统,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。 asp.net学校资源管理系统 二、功能介绍 本系统使用Microsoft Visual Studio 2019为开发工具,SQL …

python django 小程序点餐源码

开发工具: PyCharm mysql5.7,微信开发者工具 技术说明: python django html 微信小程序 代码注释齐全,没有多余代码,适合学习(毕设),二次开发,包含论文技术相关文档。 功能介绍&#xff1a…

Docker Swarm: 容器编排的力量和优势深度解析

文章目录 Docker Swarm的核心概念1. 节点(Node)2. 服务(Service)3. 栈(Stack) 使用Docker Swarm1. 初始化Swarm2. 加入节点3. 创建服务4. 扩展和缩减服务5. 管理栈6. 管理服务更新 Docker Swarm的优势深度解…

免费开源的区域屏幕录制(gif转换)工具(支持编辑功能)

软件优点:区域截屏,直接转换为gif即刻分享,免费开源,支持编辑功能 它可以让你轻松地录制屏幕,摄像头或画板的动画,并编辑、保存为 GIF,视频或其他格式。 下载并安装 ScreenToGif 首先&#xf…

arcgis--创建多分辨率DEM

方法一:技术链为【栅格转点】-【创建TIN】-【TIN转栅格】。首先需要将栅格转成点数据,再根据点数据创建TIN,再将TIN转栅格。 1、打开一幅DEM影像图,如下: 在【转换工具】-【由栅格转出】 -【栅格转点】工具中&#xf…

场景交互与场景漫游-场景漫游器(6)

场景漫游 在浏览整个三维场景时,矩阵变换是非常关键的,通过适当的矩阵变换可以获得各种移动或者渲染效果。因此,在编写自己的场景漫游操作器时,如何作出符合逻辑的矩阵操作器是非常重要的,但这对初学者来说还是有一定难…

vue+element实现多级表头加树结构

标题两种展示方式 方式一 完整代码: <template><div class"box"><el-tableref"areaPointTable":data"tableData"border:span-method"objectSpanMethod":header-cell-style"tableHeaderMerge"><el-ta…

MHA高可用

MHA&#xff1a; 什么是MHA&#xff1a;masterhight availabulity:基于主库的高可用环境下&#xff1a;主从复制&#xff0c;故障恢复 有一个主从的架构。 MHA实验要求&#xff0c;最少有一主两从 Mysql的单点故障问题&#xff0c;一旦主库崩溃&#xff0c;MHA可以在0-30S内…

wpf devexpress 添加GanttControl到项目

这个教程示范如何添加GanttControl 到你的项目使用内置GanttControl数据类。 要求 添加 Devexpress.Wpf.Gantt Nuget包到你的项目使用GanttControl. 数据模型 GanttControl携带和内置数据对象&#xff0c;可以使用创建视图模型&#xff1a; GanttTask 呈现甘特图任务 Gan…

BUUCTF 被偷走的文件 1

BUUCTF:https://buuoj.cn/challenges 题目描述&#xff1a; 一黑客入侵了某公司盗取了重要的机密文件&#xff0c;还好管理员记录了文件被盗走时的流量&#xff0c;请分析该流量&#xff0c;分析出该黑客盗走了什么文件。 密文&#xff1a; 下载附件&#xff0c;解压得到一个…

unity中的模型坐标系与3dmax导出的模型坐标系不一致的解决方案

unity中的模型坐标系与3dmax导出的模型坐标系不一致的解决方案 unity是左手坐标系&#xff0c;3dmax为右手坐标系 需要在3dmax中修改坐标系 顶视图中改成&#xff1a;X轴&#xff08;红色&#xff09;向右&#xff1a; Y轴&#xff08;蓝色&#xff09;朝向自己: Z轴&#xff…

Spring Boot 中使用 ResourceLoader 加载资源的完整示例

ResourceLoader 是 Spring 框架中用于加载资源的接口。它定义了一系列用于获取资源的方法&#xff0c;可以处理各种资源&#xff0c;包括类路径资源、文件系统资源、URL 资源等。 以下是 ResourceLoader 接口的主要方法&#xff1a; Resource getResource(String location)&am…

Linux常用命令——bzcat命令

在线Linux命令查询工具 bzcat 解压缩指定的.bz2文件 补充说明 bzcat命令解压缩指定的.bz2文件&#xff0c;并显示解压缩后的文件内容。保留原压缩文件&#xff0c;并且不生成解压缩后的文件。 语法 bzcat(参数)参数 .bz2压缩文件&#xff1a;指定要显示内容的.bz2压缩文…

【Coppeliasim】 通过TCP与coppeliasim通信

仿真客户端&#xff0c; 代码中启动了tcp服务器。 simrequiresim socketrequiresocket-- 以下函数将数据写入套接字&#xff08;仅为简单起见只处理单个数据包&#xff09;&#xff1a; writeSocketDatafunction(client,data)local headerstring.char(59,57,math.mod(#data,25…

ubuntu20.04在docker下运行ros-noetic

经常折腾虚拟机各双系统 &#xff0c; 想着不如把docker利用起来&#xff0c;下面算是一个初学者使用docker运行ros的记录&#xff1a; 1. 安装 使用官方安装脚本自动安装 curl -fsSL https://test.docker.com -o test-docker.shsudo sh test-docker.sh验证是否安装成功 doc…

新材料企业ERP有几种?能帮助企业解决哪些问题

在我们的生活当中会遇到各种各样的新材料&#xff0c;这些新材料对应不同的制造工艺、品质检验标准、生产工序、制造设备等。有些新材料企业的营销渠道不止一个&#xff0c;各个营销平台的经营策略和商品维护流程各不相同&#xff0c;而这也使得日常的管理工作量较大。 经过多…

工业机器人“智能制造产线6”教学案例

​智能制造单元主要以智能制造技术推广应用实际与发展需求为设计依据&#xff0c;按照“设备自动化生产精益化管理信息化人工高效化”的构建理念&#xff0c;将数控加工设备、工业机器人、检测设备、数据信息采集管控设备等典型加工制造设备&#xff0c;集成为智能制造单元“硬…

HIS医疗项目

文章目录 医疗项目简介HIS项目介绍HIS架构解析HIS业务流程图HIS项目架构图 HIS组件解析——服务支撑 内存设置为4G或以上部署NGINX服务部署web安装JDK部署Elasticsearch安装ik中文分词器 部署rabbitmq部署MySQL服务安装MySQL服务建库、授权用户导入数据 部署Redis测试Redis 部署…