38.红黑树(王道第7章查找补充知识)

news2024/10/6 16:19:24

目录

一. 红黑树的定义

二. 红黑树的性质

三. 红黑树的插入

四. 红黑树的删除(略)


一. 红黑树的定义

红黑树是二叉排序树-左子树结点值≤根结点值≤右子树结点值。

与普通BST相比,有以下要求:

  • ①每个结点或是红色,或是黑色的
  • ②根节点是黑色的
  • ③叶结点(外部结点、NULL结点、失败结点)均是黑色的
  • ④不存在两个相邻的红结点(即红结点的父节点和孩子结点均是黑色)
  • ⑤对每个结点,从该节点到任一叶结点的简单路径上,所含黑结点的数目相同
struct RBnode { //红黑树的结点定义
    int key; //关键字的值
    RBnode* parent;  //父节点指针
    RBnode* lchild;  //左孩子指针
    RBnode* rchild;  //右孩子指针
    int color;  //结点颜色,如:可用0/1表示黑/红,也可使用枚举型enum表示颜色
};

结点的黑高bh:从某结点出发(不含该结点)到达任一空叶结点的路径上黑结点总数,如图:

红黑树的黑高:指根结点的黑高。

二. 红黑树的性质

性质1:从根结点到叶结点的最长路径不大于最短路径的2倍

证明:可由性质4,5推出。

性质2:有n个内部节点的红黑树高度h\leq 2log_2(n+1)

证明:从根到叶结点的任何一条简单路径上至少有一半是黑结点,根的黑高至少是h/2,于是有n\geq 2^{h/2}-1,得证。

性质3:根节点黑高为h的红黑树,内部结点数(关键字)至少有2^h-1

三. 红黑树的插入

先查找,确定插入位置(原理同二叉排序树),

(1)插入新结点新结点是根――染为黑色
(2)插入新结点非根结点――染为红色
        2.1  若插入新结点后依然满足红黑树定义,则插入结束
        2.2  若插入新结点后不满足红黑树定义,需要调整,使其重新满足红黑树定义。如何调整:看新结点叔叔(父结点的兄弟结点)的颜色
        a.叔叔结点是黑色结点:旋转+染色
(此处操作类似平衡二叉树,从爷结点开始判断类型)LL型:右单旋,父换爷+染色;RR型:左单旋,父换爷+染色;LR型:左、右双旋,儿换爷+染色;RL型:右、左双旋,儿换爷+染色;

        b.叔叔结点是红色结点:染色+变新→叔父爷染色,爷变为新结点

例题:从一棵空的红黑树开始,插入:20,10,5,30,40,57,3,2,4,35,25,18,22,23,24,19,18

(1)插入20;

(2)插入10;

(3)插入5:此时10和5都是红结点,不满足要求4,5的叔叔结点是黑色,且从爷结点开始5是LL结点,因此执行“右单旋:父换爷+染色”,让父亲结点充当爷爷结点,然后改变父亲结点,爷爷结点的颜色。这里10换成黑色,20换成红色。

(4)插入30:此时20和30都是红结点,不满足要求4,30的叔叔结点5是红色,执行“染色+变新”,把叔叔,父亲,爷爷结点统统调换颜色,然后把爷爷结点10视为新插入的结点,再递归的执行一遍规则。这里10就是根结点,所以把10再染黑即可。

(5)插入40:此时30和40都是红结点,违反了要求4,40的叔叔结点是黑色,并且40是RR型,执行“父换爷+染色”,30充当爷结点,20就只能挂在30左子树,然后把20,30的颜色交换。

(6)插入57:此时57和40都是红结点,不满足要求4,57的叔叔结点20是红色,执行“染色+变新”,把叔叔,父亲,爷爷结点统统调换颜色,然后把爷爷结点30视为新插入的结点,再递归的执行一遍规则。这里并没有违反红黑树的要求,所以不做任何操作。

(7)插入3:没有破坏红黑树的要求4,所以不做任何操作。

(8)插入2:此时2和3都是红结点,不满足要求4,2的叔叔结点是黑色,且从爷结点开始2是LL结点,因此执行“右单旋:父换爷+染色”,让父亲结点充当爷爷结点,然后改变父亲结点,爷爷结点的颜色。这里3换成黑色,5换成红色。

(9)插入4:此时5和4都是红结点,不满足要求4,4的叔叔结点2是红色,执行“染色+变新”,把叔叔,父亲,爷爷结点统统调换颜色,然后把爷爷结点3视为新插入的结点,再递归的执行一遍规则。这里并没有违反红黑树的要求4(对于非根结点),所以不做任何操作。

(10-12)插入35,25,18:没有破坏红黑树的要求4,所以不做任何操作。

(13)插入22:此时22和25都是红结点,不满足要求4,22的叔叔结点18是红色,执行“染色+变新”,把叔叔,父亲,爷爷结点统统调换颜色,然后把爷爷结点20视为新插入的结点,再递归的执行一遍规则。这里20也违反红黑树的要求4(对于非根结点),所以再看20的叔叔结点3,它是红色。所以执行“染色+变新”,爷爷结点10视为新插入的结点,它是根结点,直接涂黑即可。

(14)插入23:此时22和23都是红结点,不满足要求4,23的叔叔结点是黑色,且从爷结点开始23是LR结点,因此执行“左、右双旋,儿换爷+染色”,经历两次旋转让儿子结点充当爷爷结点,然后改变儿子结点,爷爷结点的颜色。这里23换成黑色,25换成红色。

(15)插入24:此时24和25都是红结点,不满足要求4,24的叔叔结点22是红色,执行“染色+变新”,把叔叔,父亲,爷爷结点统统调换颜色,然后把爷爷结点23视为新插入的结点,再递归的执行一遍规则。23的叔叔40是黑色,且23处于LR的位置,因此执行“左、右双旋,儿换爷+染色”,经历两次旋转让儿子结点充当爷爷结点,然后改变儿子结点,爷爷结点的颜色。这里23换成黑色,30换成红色。

(16)插入19:没有破坏红黑树的要求4,所以不做任何操作。

(17)插入18:这里已经有了一个18,可以直接插在黑色18的下面,也可以插在19的下面。如果插在19的下面,19的叔叔是黑色,且18处于RL的位置,因此执行“右、左双旋,儿换爷+染色”,经历两次旋转让儿子结点充当爷爷结点,然后改变儿子结点,爷爷结点的颜色。这里18换成黑色,另一个18换成红色。

四. 红黑树的删除(略)

①红黑树删除操作的时间复杂度O(log_2n)
②在红黑树中删除结点的处理方式和二叉排序树的删除一样
③按②删除结点后,可能破坏“红黑树特性”,此时需要调整结点颜色、位置,使其再次满足“红黑树特性”。

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

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

相关文章

探索C++赋值运算符重载的内部机制:手把手教你精通

W...Y的主页 😊 代码仓库分享💕 🍔前言: 前一篇博客中我们已经了解并学习了初始化和清理模块中的构造函数与析构函数,还有拷贝复制中的拷贝复制函数,它们都是类与对象中重要的成员,今天我们要…

构建实时视频聊天应用:使用WebRTC和Netty的完整指南

构建实时视频聊天应用:使用WebRTC和Netty的完整指南 使用WebRTC和Netty构建实时视频聊天应用准备工作步骤1:创建Netty服务器步骤2:创建WebRTC前端应用步骤3:处理WebRTC连接步骤4:处理Netty服务器端步骤5:运…

光流法动目标检测

目录 前言 一、效果展示 二、光流法介绍 三、代码展示 总结 前言 动目标检测是计算机视觉领域的一个热门研究方向。传统的方法主要基于背景建模,但这些方法对于光照变化、遮挡和噪声敏感。因此,研究人员一直在寻找更加鲁棒和有效的技术来解决这一问题。…

如何性能测试中进行业务验证?

在性能测试过程中,验证HTTP code和响应业务code码是比较基础的,但是在一些业务中,这些参数并不能保证接口正常响应了,很可能返回了错误信息,所以这个时候对接口进行业务验证就尤其重要。下面分享一个对某个资源进行业务…

CentOS 7设置固定IP地址

当我们安装了一个虚拟机或者装了一个系统的时候,经常会遇到需要设置固定ip的情况,本文就以Centos 7为例,讲述如何修改固定IP地址。 1、用ifconfig命令查看使用的网卡 如上图所示,我们就会看到我们目前使用的网卡名称 2、编辑网卡…

nginx创建站点“nginx: [emerg] host not found in upstream”错误

nginx配置语法上没有错误的,只是系统无法解析这个域名,所以报错. 解决办法就是添加dns到/etc/resolv.conf 或者是/etc/hosts,让其能够解析到IP。具体步骤如下: vim /etc/hosts 修改hosts文件,在hosts文件里面加上一句 127.0.0.1 localhost.localdomain x…

TiDB x 北京银行丨新一代分布式数据库的探索与实践

北京银行作为中国最大的城商行,坚持以数字化转型统领发展模式、业务结构、客户结构、营运能力、管理方式的五大转型,分布式数据库建设是北京银行数字化转型的重要组成部分。 在新时代、新监管、新业态、新模式的数字化转型背景下,监管要求的…

刚刚腾讯云发布了2023年双11优惠活动!终于等到你

终于等到你,想买台腾讯云服务器,等啊等,终于等来了2023年腾讯云双十一优惠活动,还好没让我失望,2核4G5M带宽的轻量应用服务器三年566,省钱了: txybk.com/go/1111 哈哈哈哈哈。 2023腾讯云双11优…

《低代码指南》——如何用维格表搭建CRM

信息 手机上就能随时随地记录客户信息更智能地进行部门协作、沟通让每一项客户沟通都有迹可循一个表格实现客户全生命周期管理企业如何在激烈的市场竞争中崭露头角,拥有自己的立足之地,CRM 系统必然是一大助力。但传统 CRM 系统功能太多太复杂,不够灵活,内部推广、维护又很…

Linux常用命令——clear命令

在线Linux命令查询工具 clear 清除当前屏幕终端上的任何信息 补充说明 clear命令用于清除当前屏幕终端上的任何信息。 语法 clear实例 直接输入clear命令当前终端上的任何信息就可被清除。 在线Linux命令查询工具

Python下载安装

本文以Windows下安装python3.6为例 一、进入Python的官网,链接: python官网 二、选择下载,选择Windows 三、选择自己需要版本的python进行下载 四、选择所下载的exe文件,选择Upgrade Now 五、等待下载 六、安装成功

基于蝗虫算法的无人机航迹规划-附代码

基于蝗虫算法的无人机航迹规划 文章目录 基于蝗虫算法的无人机航迹规划1.蝗虫搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要:本文主要介绍利用蝗虫算法来优化无人机航迹规划。 1.蝗虫搜索算法 …

Java实现添加文字水印、图片水印

目录 前言 一、获取原图片对象信息 1、读取本地图片 2、读取网络图片 二、处理水印 三、添加水印 四、获取目标图片 五、完整工具类 六、结果展示 前言 现在很多人都喜欢在各种平台上分享自己的照片吧,不管是一些制作出来的媒体图片还是精致的人像图片&…

人大金仓三大兼容:MySQL迁移无忧

近日,MySQL 5.7停服事件引发广泛关注。MySQL目前已经成为中国用户使用非常广泛的数据库,其中5.7版本的用户比重又是最高的。随着信息技术应用创新深入各行各业,国产数据库对MySQL的平滑替换成为大势所趋。 作为数据库领域国家队,人…

Jmeter并发压测数据库的TPC值

Apache JMeter 视频讲解演示:https://www.bilibili.com/video/BV1Dh4y1J7NW/ Apache组织开发的基于Java的压力测试工具,常常用来模拟高并发压测场景 下载网址:https://jmeter.apache.org/download_jmeter.cgi 下载二进制包,解…

【深度学习 | Transformer】释放注意力的力量:探索深度学习中的 变形金刚,一文带你读通各个模块 —— 总结篇(三)

🤵‍♂️ 个人主页: AI_magician 📡主页地址: 作者简介:CSDN内容合伙人,全栈领域优质创作者。 👨‍💻景愿:旨在于能和更多的热爱计算机的伙伴一起成长!!&…

【linux系统】服务器安装Pycharm

文章目录 安装pycharm步骤1. 进入pycharm官网2. 上传到服务器3. 安装过程 摘要:pycharm是Python语言的图形化开发工具。因为如果在Linux环境下的Python shell 中直接进行编程,其无法保存与修改,在大型项目当中这是很不方便的,而py…

【废话文学】各种概念混搭

我认为他一定是在主体意识中出现了一种异常的反馈 这种反馈打破了既定的习惯性模式 于是思维意识出现了层阶梯式的神话 我认为通过XXX同志这个主体意识上的问题 要看出他自身的轨迹而带有意念性 这个悲剧带有鲜明的主观色彩和思辨色彩 而不要只听着在对他人生哲学上的虚无上的研…

自动化测试工具的定义及作用

在现代软件开发中,质量和效率是至关重要的。为了确保软件在不断变化的市场中脱颖而出,开发团队需要寻找方法来提高质量、降低错误率,并加速交付速度。自动化测试工具是一种不可或缺的资源,可以帮助开发团队实现这些目标。本文将深…

前三季净利降八成!科大讯飞增长放缓,刘庆峰怎么应对

大数据产业创新服务媒体 ——聚焦数据 改变商业 国内A股上市公司中,科大讯飞一度是唯一一家连续十年营收增长达到25%的高科技企业。财报显示,在三年疫情最为艰难的2021年,科大讯飞依旧录得183亿元营收,同比增长40%;归…