红黑树的原理

news2024/11/18 21:39:51

文章目录

  • 红黑树的原理
  • 红黑树的定义
  • 为什么会有红黑树
  • 红黑树构建

红黑树的原理

红黑树(Red-Black Tree)是一种自平衡的二叉搜索树,它在计算机科学中被广泛应用于实现有序集合和映射等数据结构。它通过引入颜色标记和一些特定的操作规则,保持了树的平衡性,从而确保了高效的插入、删除和查找操作。

红黑树的原理可以通过以下几个规则来解释:

节点颜色:每个节点被标记为红色或黑色。

根节点和叶子节点:根节点是黑色的,叶子节点(NIL节点或空节点)是黑色的。叶子节点不存储数据,只用作树的结束标志。

节点路径:从每个节点到其每个叶子节点的路径上,包含相同数量的黑色节点。这个规则确保了树的黑色平衡,即任意路径上的黑色节点数量是相同的。

红色节点规则:不能有两个相邻的红色节点。这个规则确保了树的红色平衡,即红色节点在树中分布均匀。

插入操作:当插入一个新节点时,首先按照二叉搜索树的插入规则将节点插入到合适的位置,并将节点标记为红色。然后,根据红黑树的规则进行必要的调整,以保持红黑树的性质。调整包括以下几种情况:(1)变色:如果父节点和叔节点都是红色,将父节点和叔节点变为黑色,祖父节点变为红色。(2)旋转:如果父节点是红色,但叔节点是黑色或缺失(NIL节点),且新节点是父节点的右子节点,或者父节点是祖父节点的左子节点且新节点是父节点的左子节点,进行相应的旋转操作来调整节点位置。

删除操作:当删除一个节点时,首先按照二叉搜索树的删除规则删除节点,并用其后继节点或前驱节点来替代被删除的节点。然后,根据红黑树的规则进行必要的调整,以保持红黑树的性质。调整包括以下几种情况:(1)兄弟节点为红色:通过旋转操作将兄弟节点变为黑色,然后重新调整。(2)兄弟节点为黑色且其子节点都为黑色(包括NIL节点):将兄弟节点变为红色,然后将当前节点上移作为新的当前节点。(3)兄弟节点为黑色且至少有一个子节点为红色:通过旋转操作调整节点位置。

通过这些规则和调整操作,红黑树保持了平衡性,确保了树的高度始终保持在较小的范围内,使得插入、删除和查找操作的时间复杂度保持在O(log n)级别。这使得红黑树在许多应用中成为一种高效的数据结构选择,如C++ STL中的map和set就是基于红黑树实现的。

红黑树的定义

定义 — 是每个节点都带有颜色属性(颜色为红色或黑色)的自平衡二叉查找树,满足下列性质:
1)节点是红色或黑色;
2)根节点是黑色;
3)所有叶子节点都是黑色节点(NULL);
4)每个红色节点必须有两个黑色的子节点。(从每个叶子到根的所有路径上不能有两个连
续的红色节点。)
5)从任一节点到其每个叶子的所有简单路径都包含相同数目的黑色节点。
在这里插入图片描述

为什么会有红黑树

在有些时候,二叉树就已经能够达到很高的效率了,但是有一种情况会导致效率下降

15 13 16 11 9 7 5 3
按照二叉搜索树构建构建的方式,我们将得到下面这样一棵树:

在这里插入图片描述
如果我们查找值为 3 的节点,9 个节点需要比较的次数是 7 次

9 5 13 7 3 11 16 15
同样的数据,如果我们按照以下顺序构造一棵二叉排序树:

在这里插入图片描述
则查找值为 3 的节点,9 个节点需要比较的次数是 3 次. 为什么两者达到了如此之大的差距,原因是第一棵树左右不够平衡,导致出现比较极端的情况。

解决方案: 红黑树
红黑树是一种自平衡二叉查找树,从上面红黑树的图可以看到,根结点右子树显然比左子树高,但左子树和右子树的黑结
点的层数是相等的,也即任意一个结点到到每个叶子结点的路径都包含数量相同的黑结点。所以我们叫红黑树这种平衡为
黑色完美平衡

红黑树构建

第一步:使用第一个元素 15 创建根节点,根节点一定是黑色,如图:
在这里插入图片描述

第二步:将 13 加入到红黑树,按照二叉搜索树的规则,13 应插入到 15 的左子节点上面,此时插入红色节点不会破坏红黑树的平衡,直接插入即可,如图:
在这里插入图片描述

第三步:将 16 加入到红黑树,16 应插入到 15 的右子节点上面,此时插入红色节点不会破坏红黑树的平衡,直接插入即可,如图所示在这里插入图片描述

第四步:将 11 加入到红黑树,11 应插入到 13 的左子节点上面,此时继续插入红色节点会破坏红黑树的平衡规则,红色
节点下必须是一对黑色子节点,而插入黑色节点也违背了规则 5(从任一节点到其每个叶子的所有简单路径都包含相同数
目的黑色节点),所以必须进行如下特殊处理:
1.将 11 的父节点 13 和叔父节点都设置为黑色
在这里插入图片描述

第五步 将 9 加入到红黑树,9 应插入到 11 的左子节点上面,此时无论插入红色节点或黑色节点都会破坏规则,必须对节
点做乾坤大挪移处理:
在这里插入图片描述
第五步 将 7 加入到红黑树,7 应插入到 9 的左子节点上面,此时无论插入红色节点或黑色节点都会破坏规则,必须对节
点做变色处理:
在这里插入图片描述
第六步 将 5 加入到红黑树,5 应插入到 7 的左子节点上面,此时无论插入红色节点或黑色节点都会破坏规则,必须对节
点做旋转处理:
在这里插入图片描述
第七步 将 3 加入到红黑树,3 应插入到 5 的左子节点上面,此时无论插入红色节点或黑色节点都会破坏规则,我们先对
父节点和叔叔节点做变色处理:
在这里插入图片描述
但这样破坏了红色节点 11 必须有两个黑色子节点的规则,因此还得进一步向上调整,此时,要保障红黑树的平衡,我们需
要对根节点进行右旋
在这里插入图片描述

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

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

相关文章

springboot+vue“智慧食堂”设计与实现springboot002

大家好✌!我是CZ淡陌。一名专注以理论为基础实战为主的技术博主,将再这里为大家分享优质的实战项目,本人在Java毕业设计领域有多年的经验,陆续会更新更多优质的Java实战项目,希望你能有所收获,少走一些弯路…

JAVA医药进销存管理系统(附源码+调试)

JAVA医药进销存管理系统 功能描述 (1)登录模块:登录信息等存储在数据库中 (2)基本信息模块:分为药品信息模块、客户情况模块、供应商情况模块; (3)业务管理模块&#x…

QStandardItem通过setCheckable添加复选框后无法再次通过setCheckable取消复选框的问题

前言 如题所示&#xff0c;通过setCheckable添加复选框后&#xff0c;想要通过setCheckable(false)取消复选框&#xff0c;你会发现根本没有作用的。 问题复现 #include "widget.h" #include "ui_widget.h" #include <QList>Widget::Widget(QWidg…

QT基础教学(QMainWindow)

文章目录 前言一、QMainWindow介绍二、代码示例三、QMainWindow高级用法总结 前言 之前我们都是在QWidget中来进行学习的&#xff0c;那么今天我将为大家讲解一下QMainWindow。 一、QMainWindow介绍 QMainWindow是Qt框架提供的一个重要的窗口类&#xff0c;用于创建具有标准…

结构体的简单介绍(4)——位段

目录 位段的概念&#xff1a; 位段的内存分配&#xff1a; 问题1&#xff1a;当开辟了内存后&#xff0c;内存中每个比特位从右向左使用?还是从左向右使用? 这个不确定。 问题2&#xff1a;当前面时候&#xff0c;剩余的空间不足下一个成员使用的时候&#xff0c;剩余的空…

1.使用turtle换一个五环2.设计这样一个程序:输入一个数字 判断它是不是一个质数

1.使用turtle换一个五环 import turtle turtle.pensize(15) turtle.penup() turtle.color(blue) turtle.goto(-150,-35) turtle.pendown() turtle.circle(60) turtle.penup() turtle.color(black) turtle.goto(0,-35) turtle.pendown() turtle.circle(60) turtle.penup() turtl…

ffplay源码解析-PacketQueue队列

包队列架构位置 对应结构体源码 MyAVPacketList typedef struct MyAVPacketList {AVPacket pkt; //解封装后的数据struct MyAVPacketList *next; //下一个节点int serial; //播放序列 } MyAVPacketList;PacketQueue typedef struct PacketQueue {MyAVPacketList …

LeetCode题解-让所有学生保持开心的分组方法数

⭐简单说两句⭐ 作者&#xff1a;后端小知识 CSDN个人主页&#xff1a;后端小知识 &#x1f50e;GZH&#xff1a;后端小知识 &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; 亲爱的各位友友们&#xff0c;今天来给大家讲解一道力扣中等题&…

为什么要有override

多态一定会成功吗 因为逻辑是用户编写的&#xff0c;那么肯定会有遗漏的地方&#xff0c;那就要规则来限制。就比如多态&#xff0c;都知道条件之一是子类重写了父类的虚函数&#xff0c;但是如果子类没有严格遵守这个规则&#xff0c;就无法达到目的。就比如这个代码&#xf…

华清 c++ day7 9月14

#include <iostream> using namespace std;template<typename T> class myVector { private:T* arr;size_t size; //元素数量size_t max_size; //数组容量 public://构造函数myVector() :arr(nullptr), size(0), max_size(0) {}myVector(int size){if (size >…

ts 枚举类型原理及其应用详解

ts 枚举类型介绍 TypeScript的枚举类型是一种特殊的数据类型&#xff0c;它允许开发者为一组相关值定义一个共同的名称&#xff0c;使我们可以更清晰、更一致地使用这些值。 枚举类型在TypeScript中用enum关键字定义&#xff0c;每个枚举值默认都是数字类型&#xff0c;从0开…

Cannot access defaults field of Properties

今天打包maven项目时报错&#xff1a; 解决方案&#xff1a;在pom.xml中加入&#xff1a; <build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-war-plugin</artifactId><version>3.3.1…

C#---第22:Newtonsoft中json/array的解析、创建、SelectToken(获取指定values)方法

1.解析json & array (1)json解析 using Newtonsoft.Json.Linq;string json "{CPU: Intel,Drives: [DVD read/writer,500 gigabyte hard drive]}";JObject o JObject.Parse(json);Console.WriteLine(o.GetType()); Console.WriteLine(o.ToString()); Console.…

Windows配置python(anaconda+vscode方案)的主要步骤及注意事项

Windows配置python&#xff08;anacondavscode方案&#xff09;的主要步骤及注意事项 1、准备工作 anaconda&#xff0c;官网下载&#xff08;直接下载最新版&#xff09;vscode&#xff0c;官网下载 (官网直接下载有可能太慢&#xff0c;可以考虑在国内靠谱的网站上下载&…

GIS跟踪监管系统单元信息更新

GIS跟踪监管系统单元信息更新 单元信息更新。① 新增单元。② 编辑单元。③ 删除单元。物资查询&#xff08;1&#xff09;物资查询与展示。① 几何查询。• 单击查询&#xff1a;• 拉框查询&#xff1a;• 多边形查询&#xff1a;② 物资定位。• 多个物资定位&#xff1a; 单…

Python爬虫实战案例——第五例

文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff01;严禁将文中内容用于任何商业与非法用途&#xff0c;由此产生的一切后果与作者无关。若有侵权&#xff0c;请联系删除。 目标&#xff1a;采集三国杀官网的精美壁纸 地址&#xff1a;aHR0cHM6Ly93d3…

普中51-独立按键实验

独立按键实验 通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时&#xff0c;电压信号 如下图所示&#xff1a; 由于机械点的弹性作用&#xff0c;按键开关在闭合时不会马上稳定的接通&#xff0c;在断开时 也不会一下子断开&#xff0c;因而在闭合和断开的瞬间均伴…

Windows11系统C盘用户文件夹下用户文件夹为中文,解决方案

说明&#xff1a; 1. 博主电脑为Windows11操作系统&#xff0c;亲测有效&#xff0c;修改后无任何影响&#xff0c;软件都可以正常运行&#xff01; 2. Windows10系统还不知道可不可行&#xff0c;因为Windows11的计算机管理中没有本地用户和组&#xff0c;博主在csdn上看到很…

华为云云耀云服务器L实例评测|redis漏洞回顾 MySQL数据安全解决 搭建主从集群MySQL 相关设置

前言 最近华为云云耀云服务器L实例上新&#xff0c;也搞了一台来玩&#xff0c;期间遇到过MySQL数据库被攻击的情况&#xff0c;数据丢失&#xff0c;还好我有几份备份&#xff0c;没有造成太大的损失&#xff1b;后来有发现Redis数据库被攻击的情况&#xff0c;加入了redis密…

R语言绘制热图

1、初步绘图 rm(listls())#clear Global Environment setwd(D:/Desktop/0000/code-main/热图)#设置工作路径#加载R包 library (pheatmap) #读取数据 df <- read.table(file"data.txt",sep"\t",row.names 1, headerT,check.namesFALSE) #查看前3行 hea…