红黑树(RBTree)

ops/2024/12/14 9:24:14/

一、红黑树的概念

红黑树的每个节点都有颜色(非黑即红),通过颜色来保证红黑树的平衡,是平衡搜索二叉树的一种。

二、红黑树的特性

1、任意一条路径上的节点都不能出现连续的红色节点。

2、最长路径不会超过最短路径的2倍。

3、任何一条路径的黑色节点都相同。

4、根节点一定是黑色。

5、叶子节点指向的空节点也是黑色。

三、如何保证红黑树的特性不被改变

1、当我们插入一个节点时应当插入什么颜色?

应当插入红色节点因为如果插入黑色节点那么这条路劲上的黑色节点会多一个其他路径上的黑色节点个数均少于该路径的黑色节点违反了特性3(任何一条路径的黑色节点都相同。)当我们插入红色节点时只会改变该路径上的黑白树特性1(任意一条路径上的节点都不能出现连续的红色节点。)

2、当我们插入一个红色节点单其父亲节点是红色应该怎么办呢?

有两种方法:

(1)改变颜色叔节点的颜色:如下图所示当我们要插入一个节点(30)时其父节点(20)是红色当(20)有兄弟节点(10)时那么该节点一定是红色(如果是黑色则该树违背了特性3)因此我们只需要将节点(15)改为红色,叔节点(10)和父亲节点(20)改为黑色即可。

(2)进行旋转: 

  • 左旋转:当插入新节点(20)时由于父亲节点(15)是红色进行左旋,将(15)的左边指向(10),将(10)的右边指向(15)的右边,再将(15)改为黑色,(10)改为红色。

  • 右旋转:当插入新节点(5)时由于父亲节点(8)是红色进行右旋,将(8)的右边指向(10),将(10)的左边指向(8)的右边,再将(8)改为黑色,(10)改为红色。

  • 右左双旋:所谓的左右双旋就是先进行右旋在进行左旋,当插入节点(15)时先将(20)进行右旋,(20)的左边指向(15)的右边,(15)的右边指向(20),然后再将(10)进行左旋,将(15)的左边指向(10),将(10)的右边指向(15)的右边,再将(15)改为黑色,(10)改为红色。

  • 左右双旋: 所谓的左右双旋就是先进行左旋在进行右旋,当插入节点(8)时先将(5)进行左旋,(5)的右边指向(8)的左边,(8)的左边指向(5),然后再将(10)进行左旋,将(8)的右边指向(10),将(10)的左边指向(8)的右边,再将(8)改为黑色,(10)改为红色。

3、 通过上述步奏可以保证每条路径上的黑色节点都相同,并且没有连续的两个红色节点,但是为什么就保证了最长路径不超过最短路径的两倍呢?

最长路径:黑节点和红节点相互交替的路径。

最短路径:全是黑节点的路径。

由于最长路径相当于在全是黑色节点的路径上间接插入红色节点,由于根节点是黑色的,叶子节点指向的空节点也是黑色,因此最长路径永远不可能比最短路径的两倍大。


http://www.ppmy.cn/ops/141774.html

相关文章

知识库系统,集成neo4j,集成activiti工作流,集成es全文检索,知识图谱血缘关系,nlp知识库

一、项目介绍 一款全源码,可二开,可基于云部署、私有部署的企业级知识库云平台,一款让企业知识变为实打实的数字财富的系统,应用在需要进行文档整理、分类、归集、检索、分析的场景。 为什么建立知识库平台? 助力企业…

DevExpress Blazor UI v24.1新版亮点:Scheduler(日程)组件全新升级

DevExpress Blazor UI组件使用了C#为Blazor Server和Blazor WebAssembly创建高影响力的用户体验,这个UI自建库提供了一套全面的原生Blazor UI组件(包括Pivot Grid、调度程序、图表、数据编辑器和报表等)。 DevExpress Blazor控件目前已经升级…

【含开题报告+文档+PPT+源码】基于微信小程序的点餐系统的设计与实现

开题报告 随着互联网技术的日益成熟和消费者生活水平与需求层次的显著提升,外卖点餐平台在中国市场上迅速兴起并深深植根于民众日常生活的各个角落。这类平台的核心在于构建了一个基于互联网的强大订餐服务系统,它无缝整合了餐饮商户资源与广大消费者的…

【新立电子】FPC材料的选择与性能优化

FPC柔性线路板,其材料的选择与性能优化,直接关系到电路板的整体性能、可靠性及应用范围,是电子工程师在设计和制造过程中必须高度重视的环节。 在材料选择上,FPC软性电路板倾向于采用高质量的基材、铜箔、覆盖膜及粘合剂。基材方…

在 Ubuntu 20.04 上安装和配置 Redis

在 Ubuntu 20.04 上安装和配置 Redis 文档概要 Redis 是一个开源的高性能键值数据库,广泛用于缓存、消息队列和实时分析等场景。本技术文档提供了在 Ubuntu 20.04 上安装、配置和测试 Redis 的完整步骤。 步骤 1:更新系统软件包列表 在安装 Redis 之前…

(5)4T刷题-逻辑代数基础

(1)逻辑函数的常用表示方法有:真值表、逻辑图、卡诺图、函数表达式 逻辑函数的表达方法中具有唯一性的是:真值表和卡诺图 (2)异或运算(题干意思不明确,应该是按位异或) …

网络编程上

二十二 网络编程上 22.1 socket套接字 import socket # 网络编程模块,套接字# 1.创建一个socket对象 socket.socket() 返回一个对象 sock socket.socket(socket.AF_INET) # 需要传递2个参数第1个参数socket.AF_INET : ipv4第2个参数socket.SOCK_STREAM TCP协议…

GTF转为excel文件

1. 加载必需的 R 包 在处理基因组数据时,我们通常需要一些专门的 R 包来读取、操作和导出数据。以下是常用的包: library(rtracklayer) # 用于导入 GTF 文件数据 library(writexl) # 用于导出数据到 Excel 格式 (.xlsx) library(openxlsx) …