红黑树详解

红黑树的概念与性质

 前置知识

在学习红黑树之前,最好有二叉查找树和AVL树的基础,因为红黑树本质就是一种特殊的二叉查找树,而红黑树的操作中需要用到AVL树中旋转的相关知识。至于二叉查找树和AVL树,可以参考如下两篇博客:

二叉查找树:二叉查找树-CSDN博客

AVL树:AVL树详解_avl tree-CS  DN博客


红黑树是一种特殊的二叉查找树,顾名思义,红黑树的一个特性就是每个节点都有一个颜色特征,或为红或为黑。红黑树可以通过一系列的限制规则保证最长路径小于最短路径的两边,也就是说,红黑树的每一条路径长度的范围为[N, 2N],其中N为最短路径长度。

与AVL树不同的是,红黑树并不是严格意义上的平衡二叉树,降低了插入和旋转的次数,所以在经常进行增删的结构中性能比AVL树更优。

红黑树是通过如下5条性质/规则来维护的:

  1. 每个结点不是红色就是黑色
  2. 根节点必须是黑色的
  3. 红色节点的孩子结点只能是黑色的,即路径上不能出现两个连续的红节点
  4. 从任一节点到其每个叶子的所有路径,要包含相同数目的黑色节点
  5. 所有的叶子结点都是黑结点

注意,由于翻译的问题,这里的叶子节点实际上指的其实是NIL节点(空节点)。所以,第5条并不算是一条规则,而是一个性质的说明。

那么为什么说这几条性质就保证了最长路径不会大于最短路径的二倍呢?首先,根节点一定是黑的就保证了每条路径的开始都是一个黑色节点。不能出现连续的红节点而且每条路径的黑色结点数量要保持一致,这种的话最短路径的情况就是整条路径都为黑色的情况,而最长路径的情况就是一黑后面紧跟着一红结点。所以我们很容易应证,最长路径不会超过最短路径的二倍。

红黑树的插入

红黑树本质上就是一种特殊的二叉查找树,所以大纲上我们依旧是按照二叉查找树的方式来插入。但是特别的,红黑树还维护了结点的颜色这一特性,所以我们还需要额外维护结点的颜色已经遵循上述的条规则/性质。

首先我们要思考,插入新结点时,是将其初始化为红色还是黑色。我们知道红黑树要控制每条路径的黑色结点相同,所以为了安全起见,一般是插入节点都默认初始化为红色节点。特别的,红黑树还要保证根节点为黑色,所以我们还需要对根节点的情况特殊处理。也就是说,除了根节点的情况外,新插入的结点都是统一初始化为红色,后续就根据具体情况具体调整了。

那么新插入结点默认为红结点,就必然会出现插入之后连续两个红色结点的情况,那么我们可以将插入之后出现连续红色结点的各种情况分为两大类来说:

首先我们规定,cur为当前新插入的节点,p为父节点,g为祖父节点,u为叔叔节点。

  • 情况1:cur为红,p为红,u存在且为红,g为黑

这里需要解释一下,cur为新插入节点,如果p是红的,那么根据红黑树的性质,g一定是黑的。这种叔叔节点存在且为红的情况比较好处理,只需要让父亲节点p和叔叔节点u的颜色置黑,g节点置黑即可。

首先,把p和u置黑是因为不能出现连续的红色节点。而把g置红是因为g并不一定就是根节点,所以为了不影响本条路径的黑色节点的数量,是需要将p置红的。那么如果g真的为根节点的话不就又与性质冲突了吗?所以我们需要特殊情况特殊处理,一般来说前面照常操作,最后之间暴力将根节点颜色设置为黑色是一种较为简便好理解的方式。

我们要知道,红黑树节点调整要在保证不改变路径上黑色节点数量的情况下进行调整,所以当叔叔节点存在且为红的时候,我们就可以通过将叔叔节点置黑,使得在保证路径上黑色节点数量不变的前提下,调整两个连续的红色节点。

  • 情况2:cur为红,p为红,g为黑,u不存在/u存在且为黑

那么当叔叔节点为黑色呢?这时我们就无法直接通过简单颜色来进行调整了,此时就需要用到AVL树中提到的4个旋转了。根据p和cur的位置,共有四种旋转的情况。不过由于双旋与单旋之后原来g位置的节点可能为cur也可能为p,所以我们这时就不能单纯的将cur置红或置黑。而是将旋转之后原g位置的节点置黑,将其两个子节点置红,叔叔节点一直是黑的或者空,所以不用对其处理。

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

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

相关文章

【XSLVGL2.0】如何新增一种语言和词条

XSLVGL2.0 开发手册 【XSLVGL2.0】如何新增一种语言和词条 1、概述2、以外置资源的方式增加词条3、以内置资源的方式增加词条4、使用方法1、概述 本文件旨在介绍新增一种语言词条的方法 2、以外置资源的方式增加词条 假设项目需要增加一种英文的词条。一般地,我们采用国际…

计算机网络——路由

文章目录 1. 前言:2. 路由基础2.1. 路由的相关概念2.2. 路由的特征2.3. 路由的过程 3 路由协议3.1. 静态路由:3.2. 动态路由:3.2.1. 距离矢量协议3.2.2. OSPF协议:3.2.2.1.OSPF概述OSPF的工作原理路由计算功能特性 3.2.2.2.OSPF报…

io.lettuce.core.RedisCommandExecutionException

io.lettuce.core.RedisCommandExecutionException: ERR invalid password ERR invalid password-CSDN博客 io.lettuce.core.RedisCommandExecutionException /** Copyright 2011-2022 the original author or authors.** Licensed under the Apache License, Version 2.0 (the…

电源控制系统架构(PCSA)之电源管理基础设施组件

目录 6.5 电源管理基础设施组件 6.5.1 电源策略单元 6.5.2 时钟控制器 6.5.3 低功耗Distributor 6.5.4 低功耗Combiner 6.5.5 P-Channel到Q-Channel转换器 6.5 电源管理基础设施组件 6.5.1 电源策略单元 本节介绍电源策略单元(Power Policy Unit, PPU)。PPU的完整细节见…

19.oracle11g中的游标

oracle11g中的游标 一、案例引入二、什么是游标三、隐式游标1、隐式游标的属性2、创建语法3、示例 四、显示游标1、显示游标的属性2、创建语法3、示例 五、REF游标1、REF游标的属性2、创建语法3、示例 六、循环游标1、 循环游标的作用2、用for 与 loop 创建3、示例 一、案例引入…

【Rust日报】2023-11-22 Floneum -- 基于 Rust 的一款用于 AI 工作流程的图形编辑器

Floneum -- 基于 Rust 的一款用于 AI 工作流程的图形编辑器 Floneum 是一款用于 AI 工作流程的图形编辑器,专注于社区制作的插件、本地 AI 和安全性。 Floneum 有哪些特性: 可视化界面:您无需任何编程知识即可使用Floneum。可视化图形编辑器可…

Educational Codeforces Round 158 (Rated for Div. 2)(A~E)(贪心,树形DP)

A - Line Trip 题意:有一条路,可以用一条数线来表示。你位于数线上的点 0 ,你想从点 0 到点 x ,再回到点 0。你乘汽车旅行,每行驶 1个单位的距离要花费 1 升汽油。当您从点 0出发时,汽车已加满油(油箱中的…

RocketMQ 消息中间件 知识点汇总

目录 RocketMQ1、什么是RocketMQ?常用术语:2、为什么需要消息队列3、什么是异步处理4、什么是服务解耦5、什么是流量控制6、消息队列两种模型队列模型:发布/订阅模型:总结:7、怎么保证消息不丢失8、如何处理消息被重复消费**出现消息重复的情况:****解决方法:**9、如何保…

基于官方YOLOv4开发构建目标检测模型超详细实战教程【以自建缺陷检测数据集为例】

本文是关于基于YOLOv4开发构建目标检测模型的超详细实战教程,超详细实战教程相关的博文在前文有相应的系列,感兴趣的话可以自行移步阅读即可:《基于yolov7开发实践实例分割模型超详细教程》 《YOLOv7基于自己的数据集从零构建模型完整训练、…

【HuggingFace Transformer库学习笔记】基础组件学习:pipeline

一、Transformer基础知识 pip install transformers datasets evaluate peft accelerate gradio optimum sentencepiece pip install jupyterlab scikit-learn pandas matplotlib tensorboard nltk rouge在host文件里添加途中信息,可以避免运行代码下载模型时候报错…

代码随想录算法训练营第五十四天|392.判断子序列 115.不同的子序列

文档讲解:代码随想录 视频讲解:代码随想录B站账号 状态:看了视频题解和文章解析后做出来了 392.判断子序列 class Solution:def isSubsequence(self, s: str, t: str) -> bool:dp [[0] * (len(t)1) for _ in range(len(s)1)]for i in ra…

matlab三维地形图

matlab三维地形图 %%%%—————Code to draw 3D bathymetry—————————— %-------Created by bobo,10/10/2021-------------------- clear;clc;close all; ncdisp E:\data\etopo\scs_etopo.nc filenmE:\data\etopo\scs_etopo.nc; londouble(ncread(filenm,lon)); lat…