数据结构复习指导之红黑树

news2024/9/22 11:31:11

目录

红黑树

考纲内容

知识框架

复习提示

1.红黑树的定义

2.红黑树的插入

3.红黑树的删除

归纳总结


红黑树

考纲内容

(一)查找的基本概念
(二)顺序查找法
(三)分块查找法
(四)折半查找法
(五)树形查找
           二叉搜索树;平衡二叉树;红黑树
(六)B树及其基本操作、B+树的基本概念
(七)散列(Hash)表
(八)查找算法的分析及应用

知识框架

复习提示

  • 本章是考研命题的重点。
  • 对于折半查找,应掌握折半查找的过程、构造判定树、分析平均查找长度等。
  • 对于二叉排序树、二叉平衡树和红黑树,要了解它们的概念、性质和相关操作等。
  • B 树和 B+树是本章的难点。对于B树,考研大纲要求掌握插入、删除和査找的操作过程;
  • 对于 B+树,仅要求了解其基本概念和性质。
  • 对于散列查找,应掌握散列表的构造、冲突处理方法(各种方法的处理过程)、查找成功和查找失败的平均查找长度、散列查找的特征和性能分析。

1.红黑树的定义

为了保持 AVL 树(平衡二叉树)的平衡性,在插入和删除操作后,会非常频繁地调整全树整体拓扑结构,代价较大。

为此在 AVL树的平衡标准上进一步放宽条件,引入了红黑树的结构。

一棵红黑树是满足如下红黑性质的二叉排序树:

① 每个结点或是红色,或是黑色的。

② 根结点是黑色的。

③ 叶结点(虚构的外部结点、NULL结点)都是黑色的。

④ 不存在两个相邻的红结点(即红结点的父结点和孩子结点均是黑色的)。

⑤ 对每个结点,从该结点到任意一个叶结点的简单路径上,所含黑结点的数量相同。

与折半查找树和 B树类似,为了便于对红黑树的实现和理解,引入了n+1个外部叶结点,以保证红黑树中每个结点(内部结点)的左、右孩子均非空。

图 7.18所示是一棵红黑树。

从某结点出发(不含该结点)到达一个叶结点的任意一个简单路径上的黑结点总数称为该结点的黑高(记为 bh),黑高的概念是由性质⑤确定的。

根结点的黑高称为红黑树的黑高。

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

由性质⑤,当从根到任意一个叶结点的简单路径最短时,这条路径必然全由黑结点构成。

由性质④,当某条路径最长时,这条路径必然是由黑结点和红结点相间构成的,此时红结点和黑结点的数量相同。

图7.18 中的 6-2和 6-15-18-20 就是这样的两条路径。

结论 2:有n个内部结点的红黑树的高度h\leqslant 2log_{2}(n+1)

证明:由结论1可知,从根到叶结点(不含叶结点)的任何一条简单路径上都至少有一半是黑结点,因此,根的黑高至少为 h/2,于是有n\geqslant 2^{h/2}-1,即可求得结论。

可见,红黑树的“适度平衡”,由 AVL 树的“高度平衡”,降低到“任意一个结点左右子树的高度,相差不超过 2 倍”,也降低了动态操作时调整的频率。

对于一棵动态查找树,若插入和删除操作比较少,查找操作比较多,则采用 AVL树比较合适,否则采用红黑树更合适。

但由于维护这种高度平衡所付出的代价比获得的效益大得多,红黑树的实际应用更广泛,C++中的map 和set(Java中的 TreeMap 和Treeset)就是用红黑树实现的。

2.红黑树的插入

红黑树的插入过程和二叉查找树的插入过程基本类似,不同之处在于,在红黑树中插入新结点后需要进行调整(主要通过重新着色或旋转操作进行),以满足红黑树的性质。

结论 3:新插入红黑树中的结点初始着为红色。

假设新插入的结点初始着为黑色,则这个结点所在的路径比其他路径多出一个黑结点(几乎每次插入都破坏性质⑤),调整起来也比较麻烦。

若插入的结点是红色的,则此时所有路径上的黑结点数量不变,仅在出现连续两个红结点时才需要调整,而且这种调整也比较简单。

设结点z为新插入的结点。插入过程描述如下:

1) 用二叉查找树插入法插入,并将结点z着为红色。

若结点z的父结点是黑色的,无须做任何调整,此时就是一棵标准的红黑树。

2) 若结点z是根结点,则将z着为黑色(树的黑高增 1),结束。

3) 若结点z不是根结点,且z的父结点z.p是红色的,则分为下面三种情况,区别在于z的叔结点y的颜色不同,因z.p是红色的,插入前的树是合法的,根据性质②和④,爷结点
z.p.p必然存在且为黑色。性质④只在z和 z.p之间被破坏了。

情况 1:z的叔结点y是黑色的,且z是一个右孩子。

情况 2:z的叔结点y是黑色的,且z是一个左孩子。

每棵子树T1、T2、T3和T4都有一个黑色根结点,且具有相同的黑高。

情况1(LR,先左旋,再右旋),即z是其爷结点的左孩子的右孩子。

先做一次左旋将此情形转变为情况 2(变为情况2后再做一次右旋),左旋后z和父结点z.p交换位置。

因为z和 z.p都是红色的,所以左旋操作对结点的黑高和性质⑤都无影响。

情况 2(LL,右单旋),即z是其爷结点的左孩子的左孩子。

做一次右旋,并交换z的原父结点和原爷结点的颜色,就可以保持性质⑤,也不会改变树的黑高。

这样,红黑树中也不再有连续两个红结点,结束。

情况1和情况2的调整方式如图7.19所示。

若父结点 z.p是爷结点 z.p.p的右孩子,则还有两种对称的情况:RL(先右旋,再左旋)和RR(左单旋),这里不再赘述。

红黑树的调整方法和 AVL树的调整方法有异曲同工之妙。

情况 3:z的叔结点y是红色的。

情况 3(z是左孩子或右孩子无影响),z的父结点z.p和叔结点y都是红色的,因为爷结点z.p.p是黑色的,将z.p和y都着为黑色,将z.p.p着为红色,以在局部保持性质④和⑤。

然后,把z.p.p作为新结点z来重复循环,指针z在树中上移两层。调整方式如图 7.20所示。

若父结点z.p是爷结点z.p.p的右孩子,也还有两种对称的情况,不再赘述。

只要满足情况3的条件,就会不断循环,每次循环指针z都会上移两层,直到满足 2)(表示z上移到根结点)或情况1或情况2的条件。

可能的疑问:虽然插入的初始位置一定是红黑树的某个叶结点,但因为在情况3中,结点z存在不断上升的可能,所以对于三种情况,结点z都有存在子树的可能。

以图 7.21(a)中的红黑树为例(虚线表示插入后的状态),先后插入5、4和 12 的过程如图 7.21所示。

插入5,为情况 3,将5的父结点3和叔结点 10着为黑色,将5的爷结点变为红色,此时因为7已是根,所以又重新着为黑色,树的黑高加1,结束。

插入4,为情况1的对称情况(RL),此时特别注意虚构黑色空结点的存在,先对5做右旋;转变为情况2的对称情况(RR),交换3和4的颜色,再对3做左旋,结束。

插入12,父结点是黑色的,无须任何调整,结束。

3.红黑树的删除

红黑树的插入操作容易导致连续的两个红结点,破坏性质④。

而删除操作容易造成子树黑高的变化(删除黑结点会导致根结点到叶结点间的黑结点数量减少),破坏性质。

删除过程也是先执行二叉查找树的删除方法。

若待删结点有两个孩子,不能直接删除,而要找到该结点的中序后继(或前驱)填补,即右子树中最小的结点,然后转换为删除该后继结点。

由于后继结点至多只有一个孩子,这样就转换为待删结点是终端结点或仅有一个孩子的情况。

最终,删除一个结点有以下两种情况:

  • 待删结点只有右子树或左子树。
  • 待删结点没有孩子。

1) 若待删结点只有右子树或左子树,则只有两种情况,如图7.22 所示。

只有这两种情况存在。子树只有一个结点,且必然是红色,否则会破坏性质。

2) 待删结点无孩子,且该结点是红色的,这时可直接删除,而不需要做任何调整。

3) 待删结点无孩子,且该结点是黑色的,这时设待删结点为y,x是用来替换y的结点(注意,当y是终端结点时,x是黑色的 NULL结点)。

删除y后将导致先前包含y的任何路径上的黑结点数量减1,因此y的任何祖先都不再满足性质⑤,简单的修正办法就是将替换y的结点x视为还有额外一重黑色,定义为双黑结点。也就是说,若将任何包含结点x的路径上的黑结点数量加1,则在此假设下,性质⑤得到满足,但破坏了性质①。

于是,删除操作的任务就转化为将双黑结点恢复为普通结点。

分为以下四种情况,区别在于x的兄弟结点w及w的孩子结点的颜色不同。

情况 1:x的兄弟结点 w是红色的。
情况 1,w必须有黑色左右孩子和父结点。交换 w和父结点 x.p的颜色,然后对 x.p 做一次左旋,而不会破坏红黑树的任何规则。

现在,x的新兄弟结点是旋转之前w的某个孩子结点,其颜色为黑色,这样,就将情况1转换为情况 2、3 或4处理。

调整方式如图 7.23 所示。

情况 2:x的兄弟结点w是黑色的,且w的右孩子是红色的。

情况 3:x的兄弟结点w是黑色的,w的左孩子是红色的,w的右孩子是黑色的。

情况 2(RR,左单旋),即这个红结点是其爷结点的右孩子的右孩子。

交换w和父结点x.p的颜色,把w的右孩子着为黑色,并对x的父结点x.p做一次左旋,将x变为单重黑色,此时不再破坏红黑树的任何性质,结束。

调整方式如图 7.24所示。

情况3(RL,先右旋,再左旋),即这个红结点是其爷结点的右孩子的左孩子。

交换w和其左孩子的颜色,然后对w做一次右旋,而不破坏红黑树的任何性质。

现在,x的新兄弟结点w的右孩子是红色的,这样就将情况3转换为了情况 2。

调整方式如图7.25 所示。

情况 4:x的兄弟结点w是黑色的,且w的两个孩子结点都是黑色的。

在情况 4 中,因为w也是黑色的,所以可从x和 w上去掉一重黑色,使得x 只有一重黑色而 w变为红色。

为了补偿从x和w中去掉的一重黑色,把x的父结点x.p额外着一层黑色,以保持局部的黑高不变。

通过将 x.p 作为新结点x来循环,x 上升一层。

若是通过情况1进入情况 4的,因为原来的x.p是红色的,将新结点x变为黑色,终止循环,结束。

调整方式如图 7.26 所示。

若x是父结点 x.p的右孩子,则还有四种对称的情况,处理方式类似,不再赘述。

归纳总结

在情况4中,因x的兄弟结点w及左右孩子都是黑色,可以从x和w中各提取一重黑色(以让 x 变为普通黑结点),不会破坏性质④,并把调整任务向上“推”给它们的父结点 x.p。

在情况1、2和3中,因为x的兄弟结点 w或w左右孩子中有红结点,所以只能在x.p子树内用调整和重新着色的方式,且不能改变 x 原根结点的颜色(否则向上可能破坏性质④)。

情况1虽然可能会转换为情况 4,但因为新x的父结点 x.p是红色的,所以执行一次情况4 就会结束。

情况 1、2和3在各执行常数次的颜色改变和至多3次旋转后便终止,情况 4是可能重复执行的唯一情况,每执行一次指针x上升一层,至多 O(log_{2}n)次。

以图 7.27(a)中的红黑树为例(虚线表示删除前的状态),依次删除5 和 15 的过程如图 7.27所示。

删除 5,用虚构的黑色 NULL 结点替换,视为双黑 NULL结点,为情况 1,交换兄弟结点12 和父结点8的颜色,对8做一次左旋;

转变为情况 4,从双黑 NULL 结点和 10 中各提取一重黑色(提取后,双黑 NULL 结点变为普通 NULL 结点,图中省略,10 变为红色),因原父结点 8是红色,所以将8变为黑色,结束。

删除15,为情况3的对称情况(LR),交换8和 10 的颜色,对8做左旋;

转变为情况2的对称情况(LL),交换10和12的颜色(两者颜色一样,无变化),将 10 的左孩子 8着为黑色,对12 做右旋,结束。

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

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

相关文章

探索自动化办公的新境界:批量操作与智能管理

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、自动化办公的必要性与价值 二、基础操作与自动化脚本 三、Python在自动化办公中的应用…

android-mvp模式

mvvm可以理解成使用databing的mvp模式,modleview 通过接口让view和Presenter层解耦 从图中就可以看出,最明显的差别就是view层和model层不再相互可知,完全的解耦,取而代之的presenter层充当了桥梁的作用,用于操作view…

Android - failed to set system property

记录一次疏忽,起因是我需要在自定义的 receiver 中保存 property 方便,方便在三方 app 中使用,结果直接崩溃了,虽然结果保存成功了,但是这种情况也是无法接收的,错误日志如下: M006082 05-25 1…

rust语言初识

程序设计实践课上水一篇ing 来源:rust基础入门-1.初识rust-酷程网 (kucoding.com) rust作为一名新兴语言,与go又有些许不同,因为它的目标是对标系统级开发,也就是C、C这两位在编程界的位置。比如我们最常用的windows系统&#x…

【Qt】数据库(一)SQLITE创建、增删查改

填坑1&#xff1a;如何连续插入 汇总SQlite语句 创建表格&#xff1a;create table <table_name> (f1 type1, f2 type2,…); 增&#xff1a;insert into <table_name> values (value1, value2,…); 改&#xff1a;update <table_name> set <f1value1>,…

聚观早报 | Bot Fit已完成开发;新一代H6将开启预售

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 5月27日消息 Bot Fit已完成开发 新一代H6将开启预售 苹果上架iPhone 14官翻机 谷歌正台积电合作开发芯片 比亚迪…

预防侵权知识丨什么是图形商标?怎么用产品图片进行图形商标查询检索?

图形商标查询检索是跨境电商预防侵权中重要的一环&#xff0c;但是有很多卖家对图形商标不太了解&#xff0c;也不知道怎么进行图形商标的查询检索。所以&#xff0c;我们一起来看下。 一、什么是图形商标 图形商标是商标的一种&#xff0c;指的是由几何图形或其它事物图案构…

idea上传git命令

git init git remote add origin git add . git commit -m "标题" git push -u origin master

linux 安装chrome浏览器

一、下载安装包 下载地址&#xff1a;https://download.csdn.net/download/k0307x1990y/89349171 二、安装流程 [rootlocalhost ~]# rpm -ivh *.rpm [rootlocalhost ~]# yum -y localinstall google-chrome-stable_current_x86_64.rpm [rootlocalhost ~]# 三、修改配置文件…

IT 行业的现状剖析与未来展望:商业与技术的交织

今日&#xff0c;我无意间看到 CSDN 的创作话题&#xff1a;“我眼中的 IT 行业现状与未来趋势”&#xff0c;这引发了我对 IT 行业的深入思考。以下是我的一些个人见解&#xff0c;希望能得到大家的指正和交流&#xff0c;共同进步。 IT 行业的现状与未来趋势&#xff0c;这个…

无人机行业所需企业服务等级证书详解

无人机行业中的民用无人机企业服务等级证书是对企业在无人机服务领域的能力、技术、管理和服务质量等方面的一种全面认可和评定。这种证书的存在&#xff0c;不仅有助于企业了解自身服务能力和水平&#xff0c;提升服务质量&#xff0c;增强市场竞争力&#xff0c;促进规范化管…

Spring 原理详解

1. Bean的作用域 Bean在Spring中表示的是Spring管理的对象&#xff0c;Bean的作用域是只Bean在Spring框架中的某种行为模式。 在Spring中&#xff0c;支持6中作用域&#xff1a; singleton&#xff1a;单例作用域&#xff0c;在整个 Spring IoC 容器中&#xff0c;只创建一个…

Alamofire常见GET/POST等请求方式的使用,响应直接为json

Alamofire 官方仓库地址&#xff1a;https://github.com/Alamofire/Alamofire xcode中安装和使用&#xff1a;swift网络库Alamofire的安装及简单使用&#xff0c;苹果开发必备-CSDN博客 Alamofire是一个基于Swift语言开发的优秀网络请求库。它封装了底层的网络请求工作&…

每日5题Day11 - LeetCode 51 - 55

每一步向前都是向自己的梦想更近一步&#xff0c;坚持不懈&#xff0c;勇往直前&#xff01; 第一题&#xff1a;51. N 皇后 - 力扣&#xff08;LeetCode&#xff09; class Solution {public List<List<String>> solveNQueens(int n) {List<List<String>…

WGCLOUD使用下发指令重启安卓设备

wgcloud的下发命令很好使&#xff0c;可以下发很多命令&#xff0c;最好的是可以选择很多主机同时下发命令 这里我想重启下我的安卓设备&#xff0c;只需要下发一个命令&#xff1a; bash reboot 就好啦 如下图

PTA 判断两个矩阵相等

Peter得到两个n行m列矩阵&#xff0c;她想知道两个矩阵是否相等&#xff0c;请你用“Yes”&#xff0c;“No”回答她&#xff08;两个矩阵相等指的是两个矩阵对应元素都相等&#xff09;。 输入格式: 第一行输入整数n和m&#xff0c;表示两个矩阵的行与列&#xff0c;用空格隔…

韬光养晦的超绝项目

发展方向 竞技闯关类 可以加入对战系统积累积分&#xff0c;竞技类的接受程度更高&#xff0c;小孩&#xff08;我和我身边大多数人小时候&#xff09;都喜欢玩王者吃鸡这种经济类游戏&#xff0c;开放世界探索&#xff08;本项目、一梦江湖、逆水寒&#xff09;的受众群体年…

最新dofm飞行棋高阶版,分享情侣版飞行棋高级版和终极版

阿星今天要给大家带来一款甜蜜蜜的小游戏——情侣飞行棋。这不是普通的飞行棋&#xff0c;而是专为情侣设计的&#xff0c;让你们的感情在游戏中升温&#xff0c;擦出更多爱的火花。 准备好了吗&#xff1f;跟着阿星一起&#xff0c;咱们来看看这款软件的魅力所在&#xff01;…

Kuberbetes图形化界面之Kuboard

1.1 Kuboard Kuboard 是一个 Kubernetes 可视化管理平台&#xff0c;它提供了一种简单易用的方式来管理和监控 Kubernetes 集群。通过 Kuboard&#xff0c;用户可以轻松地部署、扩展和管理容器化应用程序&#xff0c;同时它还提供了一些高级功能&#xff0c;比如集群监控、日志…

YOLOv10环境搭建、模型预测和ONNX推理

目录 1、开源代码、模型下载 2、环境配置 3、模型预测 4、onnxruntime测试 1、开源代码、模型下载 代码下载链接&#xff1a;https://github.com/THU-MIG/yolov10 模型下载&#xff1a; YOLOv10-N&#xff1a;https://github.com/THU-MIG/yolov10/releases/download/v1.1/…