蓝桥备赛(18)- 红黑树和 set 与 map(上)

news2025/3/14 11:09:34

对于二叉搜索树 , 平衡二叉树 , 以及红黑树 , 目前只需要了解背后的原理 , 不做代码实现的要求 , 重要的就是了解各种操作的时间复杂度即可 , 为set 与 map 做铺垫

 

一、二叉搜索树

1.1 基本概念

相较与于堆,二叉搜索树是大小关系更为严格的数据结构。但是并不需要必须是⼀棵完全二叉树,也就是树的形态是任意的。如下图所示,都是二叉搜索树!

构造一棵二叉搜索树的目的  , 并不是为了排序,而是为了提高查找和输入删除关键字的速度。

1.2 查找操作

二叉搜索树的查找是从根结点开始 ,沿某个分支逐层向下比较的过程,若二叉搜索树非空,先将给定值与根结点的关键字比较,若相等,则查找成功;若不等,如果小于根结点的关键字,则在根结点的左子树上查找,否则在根结点的右子树上查找。二这也是⼀个递归的过程。
根据BST的特性(左 < 根 < 右 )
从根结点开始一路向下找
最坏情况下会从根节点开始,查找到叶子结点。因此时间复杂度是和树的高度有关的,而树高最差会 变成一条单链表,因此时间复杂度为 O(N)

1.3 插入操作

根据BST的特性(左 < 根 < 右 )
从根结点开始一路向下找,找到合适的位置,就直接插入
插入与查找的过程一致,因此时间复杂度为 O(N

1.4 构造 BST 树

二叉搜索树的构建就是不断向原来的树中插入新的结点即可。

根据序列 a = {51, 68, 59, 27, 25, 33, 75, 70} ,构造⼀棵二叉排序树

所以时间复杂度最优的情况下是 : O(logN)
根据序列 a = {25, 27, 33, 59, 75, 51, 70, 68} ,构造⼀棵二叉排序树

在极端条件下 , 时间复杂度为 O(N)  ---> oh my god ! 骤增了!!!  

在上面两个构造二叉排序树的过程中 , 虽然结点的值都相同 , 不同的构造顺序会有不同的二叉搜索树 , 会影响查找和插入的效率 。 并且 , 构造序列越有序 , 二叉搜索树的查找效率就越低 。

1.5 删除操作

对于第三个删除结点的情况 , 我们一般是把它变成情况一或二

1)若被删除结点是叶子结点,则直接删除   

----> 此时依旧会保持二叉搜索树的性质

2)若被删除结点只有左子树或者右子树,让左子树或者右子树替代

  ----> 此时依旧会保持二叉搜索树的性质

3)若被删除结点有左子树和右子树

删除 50 这个结点,并用直接前驱来替代

删除 50 这个结点,并用直接后继来替代

删除10这个结点:

注意:我们创建二叉搜索树其实并不是为了排序 , 而是为了快速插入、删除 以及查找元素。因为BST不是那么极端的话 , 树高维持在  logN 的范围 , 上述的各种操作其实是很快的 。 但是二叉搜索树的特性并不杜绝极端情况的出现 !!!

二、平衡二叉树

在介绍二叉搜索树的时候 , 在某些特定的情况下 , 二叉搜索树是会退化成单链表 , 并且各种操作的效率也会明显下降 因此我们需要一些特别的手段保证这个二叉搜素树的“平衡”,进而保证各种操作的效率 。

2.1 基本概念

平衡二叉树 , 也称AVL树 , 它是具有以下性质的二叉搜索树

1 ) 左右子树的高度差的绝对值不超过1

2 ) 左右子树分别也是平衡二叉树

如下图所示 , 结点上方的数字表示平衡因子 。 左图是一棵平衡二叉树,右图不是!

2.2 查找操作

平衡二叉树的查找 、 插入 以及 删除操 作基本上与二叉搜索树一致 , 但是需要处理操作之后的“失衡”

重点需要掌握两种处理失衡的操作:

1) 左旋

2) 右旋

由于平衡二叉树会限制树的高度不会过高  ,趋近于 log n 级别 , 因此时间复杂度为 O(logN)

左旋(结点1)的时候遇到(结点2) “挡着了” , 

1 ) 结点1 成为右孩子的左子树

2 ) 右孩子原本的左子树(结点2)成为该结点(结点1)的右子树

右旋(结点1)的时候遇到(结点2) “挡着了” , 

1 ) 结点1 成为左孩子的右子树

2 ) 左孩子原本的右子树(结点2)成为该结点(结点1)的左子树

2.3 插入操作

最小不平衡子树:
在⼆叉搜索树中插入新结点之后,插入路径的点中,可能存在很多平衡因子的绝对值大于 1 的,此时找到 距离插入结点最近的不平衡的点 以这个点为根的 子树 就是 最小不平衡子树

2.3.1 LL型 - 右单旋

LL 表示: 新结点由于插入在 T 结点的左孩子(L)的左子树(LL)中 ,从而导致失衡。如下图所示:

T失衡了: ---> 让失衡点右旋

案例: 

2.3.2 RR型 - 左单旋

RR 表示:新结点由于插入在 T 结点的右孩子(R)的右子树(RR)中,从而导致失衡。如下图所示:

 T失衡了---> 让失衡点左旋 

案例:

2.3.3 LR型 - 左右双旋

LR 表示:新结点由于插入在 T 结点的左孩子(L)的右子树(LR)中,从而导致失衡。如下图所示:

 T失衡了: -->

1) 失衡点左孩子左旋

2) 失衡点右旋 

案例: 

2.3.4 RL型 - 右左双旋

RL 表示:新结点由于插入在 T 结点的右孩子(R)的左子树(RL)中,从而导致失衡。如下图所示:

 T失衡了: -->

1) 失衡点的右孩子右旋

2) 失衡点左旋 

案例: 

2.4 构造ALV树

平衡二叉树的构造 , 就是不断向数中插入新的结点

根据序列 a = {15, 6, 10, 17, 11, 13, 9, 20, 16, 22} ,构造一棵二叉排序树

2.5 删除操作

与插入操作的思想类似,都是先按照二叉搜索树的形式操作,然后想办法使其平衡。具体步骤:
删除结点的时候 , 调整可能不止一次 , 因为插入的时候,我们是从根结点开始查找合适的插入位置 , 是符合BST的特性 , 但是删除操作的时候 , 是随机的 。

 例一:删除 30

叶子结点直接删除,删除之后向上到根节点,所有结点都没有失衡,直接结束。

  例二:删除 10 

第⼀次调整:从 10 向上找,第⼀个不平衡子树是以 49 为根的子树,高度最高的儿子是 59,高度最高的孙子是 69,呈现右孩子右孩子,因此仅需对 59 左旋⼀次。

没有第二次调整了,因为所有都已经平衡了 

  例三:删除 57 

第⼀次调整:从 57 向上找,第⼀次出现的不平衡子树是以 49 为根的子树,高度最高的儿子是
45,高度最高的孙子是 47,呈现左孩子右孩子,因此需要让 47 左旋⼀次,然后再右旋⼀次:

 

 

第二次调整:从 47 向上找,发现 59 失衡,找到最高的孩子为 69 号结点,最高的孙子为 76 号结
点,呈现的关系是右孩子右孩子,因此将 69 左旋⼀次:

 

调整结束,因为已经到了根结点,并且根节点是平衡的。 

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

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

相关文章

obeaver 连接oracle 库 模式乱码

下载orai18n-12.1.0.2.0.jar 库--添加文件--把提前下载好的jar 随便放在一个文件夹下--添加文件选中&#xff0c;然后点击找到类&#xff0c; 选择类&#xff0c;确定即可正常 下载地址&#xff1a;https://download.csdn.net/download/weixin_42845364/88368302

ChatGPT 使用教程:深度探索AI常用功能技巧

文章目录 前言一、ChatGPT介绍1.1 人工智能与自然语言处理的发展1.2 ChatGPT 的诞生与意义 二、ChatGPT 基础入门2.1 注册与登录2.2 对话界面介绍2.3 基本提问方式 三、常用功能详解3.1 文本生成3.2 问题回答3.3 语言翻译3.4 代码生成与调试 四、高级使用技巧4.1 指令优化4.2 多…

[HUBUCTF 2022 新生赛]messy_traffic

下载附件 看到文件类型直接用wireshark打开&#xff0c;对MySQL协议进行追踪流&#xff0c;并没有什么发现&#xff0c;后面对NO.437发现有用信息&#xff0c;http追踪流 发现**system(‘cat passwd.txt’);**这里是在打开查看passwd.txt&#xff0c;密码是"SignUpForHUBU…

铁人三项(第五赛区)_2018_rop题解

先启动靶机连接看看。 直接ls&#xff0c;就给我输出句话&#xff0c;看来不能直接拿flag。 那走下流程。 查下位数和其他信息&#xff1a; 可以看到是32位的包&#xff0c;开了NX&#xff0c;但没开其他保护。 用ida32打开looklook。 主函数就是个这&#xff0c;看到了弹出的…

Compose 实践与探索六 —— 动画的流程控制与 Transition

1、Block 参数&#xff1a;监听每一帧 animateTo() 与 animateDecay() 中都有一个函数类型的 block 参数&#xff1a; suspend fun animateDecay(initialVelocity: T,animationSpec: DecayAnimationSpec<T>,block: (Animatable<T, V>.() -> Unit)? null): An…

虚拟机Contos7为啥不能被本机电脑访问?

1.查看防火墙是否开启 systemctl status firewalld.service 2.如果防火墙关闭就可以直接被访问 3.如果防火墙打开了我们需要开放端口(下面为防火墙一系列指令) # 关闭防火墙 systemctl stop firewalld.service# 打开防火墙 systemctl start firewalld.service# 关闭开启自启…

idea超级AI插件,让 AI 为 Java 工程师

引言​ 用户可在界面中直接通过输入自然语言的形式描述接口的需求&#xff0c;系统通过输入的需求自动分析关键的功能点有哪些&#xff0c;并对不确定方案的需求提供多种选择&#xff0c;以及对需求上下文进行补充&#xff0c;用户修改确定需求后&#xff0c;系统会根据需求设…

µCOS-III从入门到精通 第十四章(软件定时器)

参考教程&#xff1a;【正点原子】手把手教你学UCOS-III实时操作系统_哔哩哔哩_bilibili 一、软件定时器简介 1、定时器的概念与种类 &#xff08;1&#xff09;定时器的概念&#xff1a;从指定的时刻开始&#xff0c;经过一个指定时间&#xff0c;然后触发一个超时事件&…

MySQL数据库复杂的增删改查操作

在前面的文章中&#xff0c;我们主要学习了数据库的基础知识以及基本的增删改查的操作。接下去将以一个比较实际的公司数据库为例子&#xff0c;进行讲解一些较为复杂且现时需求的例子。 基础知识&#xff1a; 一文清晰梳理Mysql 数据库基础知识_字段变动如何梳理清楚-CSDN博…

KCD 北京站丨Volcano 邀您畅聊云原生智能调度技术与应用

AI与云原生技术正以前所未有的速度改变着我们的世界&#xff0c;而云原生技术则如同一座坚实的桥梁&#xff0c;连接着传统IT与现代化的数字世界。当AI与云原生相遇&#xff0c;它们相互赋能&#xff0c;相互促进&#xff0c;为开发者们打开了一个全新的技术宇宙。 3 月 15 日&…

BLEU评估指标

一、介绍 用于评估模型生成的句子和实际句子差异的指标&#xff0c;取值在[0,1]&#xff0c;匹配度高就距离1近&#xff0c;反之距离0近。这个指标计算代价小&#xff0c;容易理解&#xff0c;与语言无关&#xff0c;与人类评价结果高度相关。 BLEU主要基于n-gram匹配&#x…

高效自动化测试:打造Python+Requests+Pytest+Allure+YAML的接口测试框架

一、背景 在快节奏的开发周期中&#xff0c;如何确保接口质量&#xff1f;自动化测试是关键。通过构建标准化、可复用的测试框架&#xff0c;能显著提升测试效率与准确性&#xff0c;为项目质量保驾护航[1][7]。 二、目标 ✅ 核心目标&#xff1a; ● 实现快速、高效的接口测试…

BSides Vancouver: 2018 (Workshop)

BSides Vancouver: 2018 (Workshop) 来自 <https://www.vulnhub.com/entry/bsides-vancouver-2018-workshop,231/> 1&#xff0c;将两台虚拟机网络连接都改为NAT模式 2&#xff0c;攻击机上做namp局域网扫描发现靶机 nmap -sn 192.168.23.0/24 那么攻击机IP为192.168.23…

rStar论文精读

论文简介 论文标题&#xff1a;《Mutual reasoning makes smaller LLMs stronger problem-solvers》 论文地址&#xff1a;https://arxiv.org/abs/2408.06195 录用会议&#xff1a;ICLR2025 背景与挑战 挑战1&#xff1a;在SLM中平衡exploration与exploitation。一些方法有很…

247g 的工业级电调,如何让无人机飞得更 “聪明“?——STONE 200A-M 深度测评

一、轻量化设计背后的技术取舍 当拿到 STONE 200A-M 时&#xff0c;247g 的重量让人意外 —— 这个接近传统 200A 电调 70% 的重量&#xff0c;源自 1205624.5mm 的紧凑结构&#xff08;0.1mm 公差控制&#xff09;。实测装机显示&#xff0c;相比同规格产品&#xff0c;其体积…

Node.js:快速启动你的第一个Web服务器

Node.js 全面入门指南 文章目录 Node.js 全面入门指南一 安装Node.js1. Windows2. MacOS/Linux 二 配置开发环境1. VSCode集成 三 第一个Node.js程序1. 创建你的第一个Node.js程序 四 使用Express框架1. 快速搭建服务器 一 安装Node.js 1. Windows 以下是Windows环境下Node.j…

自定义日志回调函数实现第三方库日志集成:从理论到实战

一、应用场景与痛点分析 在开发过程中&#xff0c;我们经常会遇到以下场景&#xff1a; 日志格式统一&#xff1a;第三方库使用自己的日志格式&#xff0c;导致系统日志混杂&#xff0c;难以统一管理和分析。日志分级过滤&#xff1a;需要动态调整第三方库的日志输出级别&…

Linux练级宝典->任务管理和守护进程

任务管理 进程组概念 每个进程除了进程ID以外&#xff0c;还有一个进程组&#xff0c;进程组就是一个或多个进程的集合 同一个进程组&#xff0c;代表着他们是共同作业的&#xff0c;可以接收同一个终端的各种信号&#xff0c;进程组也有其唯一的进程组号。还有一个组长进程&a…

C语言:计算并输出三个整数的最大值 并对三个数排序

这是《C语言程序设计》73页的思考题。下面分享自己的思路和代码 思路&#xff1a; 代码&#xff1a; #include <stdio.h> int main() {int a,b,c,max,min,mid ; //设置大中小的数分别为max&#xff0c;mid&#xff0c;min&#xff0c;abc为输入的三个数printf("ple…

工具(十二):Java导出MySQL数据库表结构信息到excel

一、背景 遇到需求&#xff1a;将指定数据库表设计&#xff0c;统一导出到一个Excel中&#xff0c;存档查看。 如果一个一个弄&#xff0c;很复杂&#xff0c;耗时长。 二、写一个工具导出下 废话少絮&#xff0c;上码&#xff1a; 2.1 pom导入 <dependency><grou…