当前位置: 首页 > news >正文

【数据结构】平衡二叉树左旋右旋与红黑树

平衡二叉树左旋右旋与红黑树

平衡二叉树

定义

平衡二叉树是二叉搜索树的一种特殊形式。二叉搜索树(Binary Search Tree,BST)是一种具有以下性质的二叉树:

  1. 对于树中的每个节点,其左子树中的所有节点都小于该节点的值。
  2. 对于树中的每个节点,其右子树中的所有节点都大于该节点的值。
  3. 左子树和右子树都必须是二叉搜索树。

而平衡二叉树(Balanced Binary Tree)在满足了二叉搜索树的所有性质的基础上,还额外保证了树的高度尽可能小,即任意节点的左右子树高度差不超过1。

举例

以下是平衡二叉树的几个例子:

image-20240605200759976
image-20240605200952591
image-20240605201209176

旋转机制

平衡二叉树通过旋转操作来保持其平衡性。旋转操作主要有两种类型:左旋转和右旋转。这些旋转操作通常应用于AVL树和红黑树等平衡二叉树的调整过程中。

左旋转:左旋转是一种操作,将一个节点的右子节点提升为新的根节点,原来的根节点成为新根节点的左子节点。左旋转的目的是减小树的整体高度,以维持平衡。

右旋转:右旋转是一种操作,将一个节点的左子节点提升为新的根节点,原来的根节点成为新根节点的右子节点。右旋转的目的也是减小树的整体高度,以维持平衡。

触发时机:当添加一个节点之后,该树不再是一颗平衡二叉树

左旋

当我们想给

image-20240605203655251

这个二叉树中插入一个新的节点12,这个平衡二叉树就会变为:

image-20240605204026181

此时我们就会发现二叉树不平衡了,为了重新平衡,我们就需要进行旋转了。

为了进行旋转,我们需要去寻找支点:从添加的节点开始,不断的往父节点找不平衡的节点

这里我们从节点12开始往上找:

  1. 节点11:平衡
  2. 节点10:不平衡

所以节点10为支点!!

左旋的步骤

  1. 以不平衡的点作为支点
  2. 把支点左旋降级,变成左子节点
  3. 晋升原来的右子节点

旋转后的二叉树为:

image-20240605204957416

​ 以上为较为简单的左旋,下面为较为复杂的左旋


已知二叉树(不平衡):

image-20240605210025576

还是需要从添加的节点向上找不平衡的节点

  1. 节点11:平衡
  2. 节点10:平衡
  3. 节点7:不平衡

节点7为支点

而此时旋转的步骤和刚才的就有所不同了:

  1. 以不平衡的点作为支点
  2. 将根节点的右侧往左拉
  3. 原先的右子节点变成新的父节点,并把多余的左子节点出让,给已经降级的根节点当右子节点

在上面的二叉树中,多余的节点为节点9(节点9为节点10的左子结点很重要)。

下面为具体步骤:

  1. 先将节点9(多余的左子节点)分离:

    image-20240605211628021
  2. 以节点7为支点进行左旋:

    image-20240605211827936
  3. 将多余的节点进行分配

    因为节点9之前为节点10的左子结点,所以此时9节点应该继续接才节点10的左边,此处应该放在节点7的右节点上

image-20240605212502109
右旋

右旋与左旋在处理上是类似的,就不再粘贴图示了

步骤

  1. 以不平衡的点作为支点
  2. 就是将根节点的左侧往右拉
  3. 原先的左子节点变成新的父节点,并把多余的右子节点出让,给已经降级的根节点当左子节点
需要旋转的四种情况
1.左左(一次右旋)

当根节点左子树的左子树有节点插入,导致二叉树不平衡

image-20240605213057309

有两种添加情况:

image-20240605213149405

以节点7为根节点

我们只需要进行一次右旋就可以了:

image-20240605213447827
2.左右(两次旋转)

当根节点左子树的右子树有节点插入,导致二叉树不平衡

image-20240605213605753

添加节点:

image-20240605213642896

此时仅仅一次右旋就不能实现平衡了。

我们需要先一4为支点,先局部左旋,再整体右旋就可以实现了:

image-20240605213913798 image-20240605213936624
3.右右(一次旋转)

当根节点右子树的右子树有节点插入,导致二叉树不平衡

image-20240605214019749

添加节点12:

image-20240605214049887

以节点7为支点进行左旋一次就能实现平衡:

image-20240605214153270
4.右左(两次旋转)

当根节点右子树的左子树有节点插入,导致二叉树不平衡

image-20240605214225663

添加节点8:

image-20240605214256532

先局部右旋再整体左旋:

image-20240605214345028 image-20240605214403566

红黑树

  • 红黑树是一种自平衡的二叉查找树,是计算机科学中用到的一种数据结构。
  • 1972年出现,当时被称之为平衡二叉B树。后来,1978年被修改为如今的"红黑树"
  • 它是一种特殊的二叉查找树,红黑树的每一个节点上都有存储位表示节点的颜色
  • 每一个节点可以是红或者黑;红黑树不是高度平衡的,它的平衡是通过"红黑规则"进行实现的
image-20240605214802488

红黑规则

  1. 每一个节点或是红色的,或者是黑色的
  2. 根节点必须是黑色
  3. 如果一个节点没有子节点或者父节点,则该节点相应的指针属性值为Nǐl,这些Nil视为叶节点,每个叶节点(Nil)是黑色的
  4. 如果某一个节点是红色,那么它的子节点必须是黑色(不能出现两个红色节点相连的情况)
  5. 对每一个节点,从该节点到其所有后代叶节点的简单路径上,均包含相同数目的黑色节点

添加节点规则

默认颜色:添加节点默认是红色的(效率高)

举例

假设我们需要添加三个节点:201823

1.假设三个节点都是黑色的

image-20240607223039144

先添加节点20:

image-20240607223112967

然后添加节点18:

image-20240607223319365

此时我们发现我们的红黑树已经违背了红黑规则(第五条规则)

如果我们把节点18变为红色,则就满足了红黑规则:

image-20240607223414483

下来存节点23:

image-20240607223438885

依旧违背红黑规则,将23变为红色:

image-20240607223519105

一共调整了两次节点颜色

2.假设节点颜色都为红色:

那么先添加节点20:

image-20240607223640658

违背了规则2

将节点变为黑色后,插入节点18:

image-20240607223723203

并没有违背红黑规则,不需要调整

下来添加节点23:

image-20240607223812606

依然不需要调整。

一共调整了一次节点颜色

所以我们得出结论:默认颜色:添加节点默认是红色的(效率高)

小结

本篇博客到这里就结束了,如果有错误麻烦大家指正,感谢阅读!

已经到底啦!!!

相关文章:

【数据结构】平衡二叉树左旋右旋与红黑树

平衡二叉树左旋右旋与红黑树 平衡二叉树 定义 平衡二叉树是二叉搜索树的一种特殊形式。二叉搜索树(Binary Search Tree,BST)是一种具有以下性质的二叉树: 对于树中的每个节点,其左子树中的所有节点都小于该节点的值…...

2024蓝桥杯初赛决赛pwn题全解

蓝桥杯初赛决赛pwn题解 初赛第一题第二题 决赛getting_startedbabyheap 初赛 第一题 有system函数,并且能在bss上读入字符 而且存在栈溢出,只要过掉check函数即可 check函数中,主要是对system常规获取权限的参数,进行了过滤&…...

大模型多轮问答的两种方式

前言 大模型的多轮问答难点就是在于如何精确识别用户最新的提问的真实意图,而在常见的使用大模型进行多轮对话方式中,我接触到的只有两种方式: 一种是简单地直接使用 user 和 assistant 两个角色将一问一答的会话内容喂给大模型&#xff0c…...

【无标题】1877A

足球锦标赛中有 n支球队。每对队伍匹配一次。每场比赛结束后,Pak Chanek收到两个整数作为比赛结果,即两队在比赛中得分的数量。一支球队的效率等于本队每场比赛的总进球数减去对手每场比赛的总进球数。 比赛结束后,Pak Dengklek会计算每支球…...

直播美颜工具解析:美颜SDK核心技术与性能优化方法

本篇文章,小编将深入解析直播美颜SDK的核心技术及其性能优化方法,以期为开发者提供有价值的参考。 一、美颜SDK核心技术 1.实时人脸检测与识别 美颜SDK的核心技术之一是实时人脸检测与识别。这项技术基于深度学习算法,能够快速、准确地识别…...

YOLOv10开源,高效轻量实时端到端目标检测新标准,速度提升46%

前言 实时目标检测在自动驾驶、机器人导航、物体追踪等领域应用广泛,近年来,YOLO 系列模型凭借其高效的性能和实时性,成为了该领域的主流方法。但传统的 YOLO 模型通常采用非极大值抑制 (NMS) 进行后处理,这会增加推理延迟&#…...

如何解决访问网站时IP被限制的问题?

在互联网上,用户可能会面临一个令人困扰的问题——当尝试访问某个特定的网站时,却发现自己的IP地址被该网站屏蔽。 IP地址被网站屏蔽是一个相对常见的现象,而导致这种情况的原因多种多样,包括恶意行为、违规访问等。本文将解释IP地…...

springboot城市美发管理系统的设计与实现-计算机毕业设计源码71715

摘 要 信息化社会内需要与之针对性的信息获取途径,但是途径的扩展基本上为人们所努力的方向,由于站在的角度存在偏差,人们经常能够获得不同类型信息,这也是技术最为难以攻克的课题。针对城市美发管理系统等问题,对城市…...

微软 Windows 10 22H2 发布可选更新 19045.4474,修复窗口显示问题等

微软今天面向 Windows 10 22H2 版本,发布了 KB5037849 非安全可选更新,用户安装后版本号升至 Build 19045.4474。 IT之家 5 月 30 日消息,微软今天面向 Windows 10 22H2 版本,发布了 KB5037849 非安全可选更新,用户安…...

代码随想录算法训练营第五十三天 | 309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费

309.最佳买卖股票时机含冷冻期 视频讲解:动态规划来决定最佳时机,这次有冷冻期!| LeetCode:309.买卖股票的最佳时机含冷冻期_哔哩哔哩_bilibili代码随想录 解题思路 1. dp[i][0] 第i天持有股票的状态 dp[i][1]第i天不持股的状…...

Polar Web【中等】反序列化

Polar Web【中等】反序列化 Contents Polar Web【中等】反序列化思路&探索EXPPHP生成PayloadGET传递参数 运行&总结 思路&探索 一个经典的反序列化问题,本文采用PHP代码辅助生成序列字符串的方式生成 Payload 来进行手动渗透。 打开站点,分析…...

测试工具链

缺陷管理 bug管理工具 devops---项目管理--缺陷管理 bug管理地址 https://devsecops.mychery.com:8443/chery/project?filterROLE&statusACTIVE bug管理环境 采用公司的devops平台,对每个项目的bug进行管理。目前在使用 接口测试和服务端性能测试 工具…...

【求助】ansible synchronize 问题

求助贴,不是解答贴哈 最近把一台服务器从centos7.9升级到alibaba cloud linux3之后,出现了一个ansible的问题。 版本是ansible8.3.0ansible-core-2.15.3,在使用synchronize模块时,我使用了别名(比如web1)会…...

sql server 把表的所有的null改为0,不要限制某列

DECLARE tableName NVARCHAR(256) Linear -- 替换为你的表名 DECLARE sql NVARCHAR(MAX) SELECT sql UPDATE tableName SET COLUMN_NAME 0 WHERE COLUMN_NAME IS NULL; FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME tableName AND TABLE_SCHEM…...

【C#】WinForm关闭新(二级)界面使主程序关闭

参考视频:https://www.bilibili.com/video/BV1JY4y1G7jo?p14&vd_source1c57ab1b2e551da5b65c0dfb0f05a493 1.背景介绍 主程序界面,点击弹出二级界面(同时隐藏主界面),不做任何设置,这时关闭二级界面…...

光伏电站绘制软件的基本方法

随着可再生能源的快速发展,光伏电站的建设日益受到重视。为了提高光伏电站设计的效率和准确性,光伏电站绘制软件的应用变得至关重要。本文将介绍光伏电站绘制软件的基本方法,包括绘制屋顶、屋脊、障碍物和参照物,铺设光伏板&#…...

【Python】selenium使用find_element时解决【NoSuchElementException】问题的方法

NoSuchElementException 是 Selenium WebDriver 中的一种异常,我们在写selenium.find_element 的时候也比较常见,它会在我们要尝试定位一个不存在的元素时抛出这类错误。 以下是一些解决NoSuchElementException 的常用方法: 检查元素定位器:…...

oracle表锁

--oracle提醒记录被另一个用户锁住: --问题描述:你去修改数据时,报错“ --问题分析:你用select t.*,t.rowid from qxt_logsend_0728修改数据结果集时,计oracle会通过事务锁锁住这个记录,点击记录改变&#…...

父组件调用子组件方法(组合式 API版)

在 Vue 3 中,defineExpose 是一个用于在组合式 API (Composition API) 中暴露组件内部方法或属性的函数。它允许父组件通过 ref 引用子组件实例,并调用子组件暴露的方法或访问其属性。 以下是子组件和父组件如何使用 defineExpose 和 ref 的详细解释和示…...

【动手学深度学习】使用块的网络(VGG)的研究详情

目录 🌊1. 研究目的 🌊2. 研究准备 🌊3. 研究内容 🌍3.1 多层感知机模型选择、欠拟合和过拟合 🌍3.2 练习 🌊4. 研究体会 🌊1. 研究目的 理解块的网络结构;比较块的网络与传统…...

JFinal学习07 控制器——接收数据之getBean()和getModel()

JFinal学习07 控制器——接收数据之getBean()和getModel() 视频来源https://www.bilibili.com/video/BV1Bt411H7J9/?spm_id_from333.337.search-card.all.click 文章目录 JFinal学习07 控制器——接收数据之getBean()和getModel()一、接收数据的类型二、getBean()和getModel()…...

二百三十九、Hive——Hive函数全篇

--创建测试数据库test show databases ; create database if not exists test; use test;一、关系运算 1、等值比较&#xff1a; select 1 where 1 1; --1 select 1 where 0 1; --NULL 2、不等值比较&#xff1a;<> select 1 where 1 <> 2; --1 sele…...

视频去水印电脑版,视频去水印软件

视频去水印怎么去&#xff0c;一直是视频编辑者们的热门话题。那么&#xff0c;如何去除频水印呢&#xff1f;接下来&#xff0c;我们将为您详细介绍视频去水印方法。 第一种方法&#xff1a; 首先通过浏览器打开 “ 51视频处理官网” 的网站。打开网站后&#xff0c;我们上传…...

北邮21硕后端开发笔记

blog 整理北邮21渣硕Java后端开发知识网络&#xff0c;阅读笔记以及技术博客&#xff0c;持续更新&#xff01;欢迎Star&#xff01; GitHub: https://github.com/WeiXiao-Hyy/blog Java 基础篇 一文带你搞懂final关键字 Java并发编程 fucking-java-concurrency解读你真…...

【Linux】系统优化:一键切换软件源与安装Docker

引言 在Linux系统安装完成后&#xff0c;进行一些必要的初始化设置是提升系统性能和用户体验的关键。本文将重点介绍两个实用的一键脚本&#xff1a;LinuxMirrors提供的软件源切换脚本和Docker安装脚本。这两个脚本将帮助我们简化配置安装过程。 一键切换软件源脚本 在Linux…...

【集装箱调度】基于粒子群算法实现考虑重量限制和时间约束的集装箱码头满载AGV自动化调度附matlab代码

% 交叉定位 - 最小二乘法定位算法模拟 % 参数设置 numIterations 1000; % 模拟迭代次数 maxDistance 1000; % 最远定位距离&#xff08;设定范围&#xff09; speedOfSound 343; % 声速&#xff08;单位&#xff1a;m/s&#xff09; % 预警机坐标 source [0, 0]; % 初始…...

使用 ESP32 和 PlatformIO (arduino框架)实现 Over-the-Air(OTA)固件更新

使用 ESP32 和 PlatformIO 实现 Over-the-Air&#xff08;OTA&#xff09;固件更新 摘要&#xff1a; 本文将介绍如何在 ESP32 上使用 PlatformIO 环境实现 OTA&#xff08;Over-the-Air&#xff09;固件更新。OTA 更新使得在设备部署在远程位置时&#xff0c;无需物理接触设…...

学习笔记——路由网络基础——汇总静态路由

4、汇总静态路由 (1)定义 静态路由汇总&#xff1a;多条静态路由都使用相同的送出接口或下一跳 IP 地址。(将多条路由汇总成一条路由表示) (2)目的 1.减少路由条目数量&#xff0c;减小路由表&#xff0c;加快查表速度 2.增加网络稳定性 (3)路由黑洞以及路由环路的产生…...

这10个python库,下载都超过5亿

python的库数不胜数。哪些库使用得最多呢。今天分享10个下载都超过5亿的python库。从高到低排序 第一名&#xff1a;Urllib3 下载次数&#xff1a;8.93亿次 介绍&#xff1a;Urllib3是一个功能强大且用户友好的HTTP客户端库&#xff0c;提供了许多Python标准库中没有的特性&…...

Vue3【十一】08使用toRefs和toRef

08使用toRefs和toRef toRefs()函数将person对象中的name和age属性转换为响应式引用&#xff0c;并返回一个对象&#xff0c;对象中的name和age属性都是响应式引用&#xff0c;具有响应式功能。 toRef()函数将person对象中的name属性转换为响应式引用&#xff0c;并返回一个响应…...

建设银行平潭招聘网站/短视频seo厂家

上次说到可以使用Kodi来进行媒体文件的管理&#xff0c;可是Kodi本身不能播放4k HDR的视频。这次教大家一个新办法&#xff0c;就是设置Kodi&#xff0c;让Kodi在播放HDR视频时&#xff0c;使用外置的播放器&#xff0c;也就是potplayer。直奔主题&#xff0c;kodi设置外置播放…...

做网站导航怎么调整大小/南京seo按天计费

1. 电商网站里都少不了减库存的操作&#xff0c;当然什么时候减各有各的处理&#xff0c;有的下单就减&#xff0c;有的发起支付就减少&#xff0c;有的支付完成后回调时减。对于这个减库存的时间点&#xff0c;因产品而已&#xff0c;比如秒杀类必须下单就减。 减库存时就不可…...

一个专门做字画的网站/南宁seo推广优化

一. 常用命令 1. 编辑相关 ①. awk NF&#xff1a;字段总数NR&#xff1a;第几行数据FS&#xff1a;分隔字符 ②. sed -n-i 直接修改4a&#xff1a;在第四行后添加4i&#xff1a;在第四行前插入1,5c sting&#xff1a;用sting替换1到5行的内容s/要被替换的字符串/新的字符串…...

个人可以做商城网站/新网站排名优化怎么做

可以在游戏中添加或者删除物品及方块&#xff0c;包括mod附加的东西。保存和读取某个时间点背包机身上的东西。创建一个可以无限使用的物品和工具。可以用来检测mod的功能&#xff0c;创建巨大的用来生存的世界。控制界面开关&#xff1a;在背包界面按“o”可以控制TMI界面的开…...

重庆搜索引擎优化/厦门seo排名

Jenkins项目团队决定在稳定性和为Kubernetes等平台提供更好的支持方面分配一些工作量。前者可能会发生一些向后不兼容的变更&#xff0c;将影响发布模型并提供具有更多预置选项的版本&#xff0c;而后者将在与现有Jenkins X项目齐头并进。\u0026#xD;\u0026#xD;Jenkins目前在处理…...

广东网站设计推荐/百度推广竞价技巧

Java语言程序设计_基础篇_中文ppt_第四章Liang, Introduction to Java Programming, Eighth Edition, (c) 2011 Pearson Education, Inc. All rights reserved. 0132130807 第4章 循 环 引言 假设你需要打印一个字符串 (例如&#xff1a; “Welcome to Java!”)100次。这就需要…...