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

news2024/10/6 14:30:10

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

平衡二叉树

定义

平衡二叉树是二叉搜索树的一种特殊形式。二叉搜索树(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

依然不需要调整。

一共调整了一次节点颜色

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

小结

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

已经到底啦!!!

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

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

相关文章

创意KMS知识图谱ui设计合集来了

创意KMS知识图谱ui设计合集来了

解决nvidia驱动和CUDA升级问题

解决nvidia驱动和CUDA升级问题 注释:升级高版本的nvidia驱动和cuda是不影响现有的docker镜像和容器的。因为是向下兼容的。仅仅升级后重启服务器即可。 ERROR: An NVIDIA kernel module ‘nvidia-drm’ appears to already be loaded in your kernel. This may be…

微信公众号二维码登录

微信扫码登录: 方式1、微信开放平台:第三方应用接入,依赖公司在【微信开放平台】用【公司营业执照】注册的账号,才能实现扫码登录 微信开放平台 方式2、微信公众平台:扫码通过微信公众号授权登录的,借助个人…

【vscode,gdb】在vscode调试时显示STL容器内容(开启gdb的pretty-printing)

在gdb调试cpp代码时,会发现它无法打印stl库中的容器,所以需要利用pretty-printing来将它打印出来 配置方法 在home下新建文件夹.gdb,然后在.gdb下新建文件printers.py 进入网址https://gcc.gnu.org/git/?pgcc.git;ablob_plain;flibstdc%2…

Mamba v2诞生:2 那些烧脑的矩阵们

大模型技术论文不断,每个月总会新增上千篇。本专栏精选论文重点解读,主题还是围绕着行业实践和工程量产。若在某个环节出现卡点,可以回到大模型必备腔调或者LLM背后的基础模型新阅读。而最新科技(Mamba,xLSTM,KAN)则提…

用自然语言连接信息孤岛

信息孤岛互联互通的困难 尽管已经进入了互联网时代,信息系统中的信息孤岛现象仍然十分地严重,不同部门,不同机器之间难以实现信息的互联互通。存在大量的信息孤岛。 不同信息系统的相互通信依赖通信协议和数据模型的定义,前者决定…

南卡、漫步者和Cleer该怎么选?高性价比耳机推荐!

身为一位拥有五年资历的数码产品评测专家,我亲身体验了各类蓝牙耳机,足迹遍及小众新秀至国际知名品牌。频繁受邀于不同厂商,为他们的新品提供专业见解,同时,我的社交平台私信中也满载着粉丝关于开放式耳机选择的热切询…

乡村振兴的乡村旅游品质提升:提升乡村旅游服务质量,打造乡村旅游品牌,增强乡村旅游吸引力,打造具有旅游特色的美丽乡村

目录 一、引言 二、提升乡村旅游服务质量 1、完善基础设施建设 2、提升服务人员素质 3、规范服务流程 三、打造乡村旅游品牌 1、挖掘乡村文化特色 2、打造特色旅游产品 3、加强品牌宣传和推广 四、增强乡村旅游吸引力 1、创新旅游体验方式 2、打造旅游精品线路 3、…

【力扣】矩阵中的最长递增路径

一、题目描述 二、解题思路 1、先求出以矩阵中的每个单元格为起点的最长递增路径 题目中说,对于每个单元格,你可以往上,下,左,右四个方向移动。那么以一个单元格为起点的最长递增路径就是:从该单元格往上…

2021年vue面试题整理(万字解析)

一、对MVVM的理解 MVVM分为Model、View、ViewModel。 Model 代表数据模型,数据和业务逻辑都在Model层中定义;泛指后端进行的各种业务逻辑处理和数据操控,对于前端来说就是后端提供的 api 接口。 View 代表UI视图,负责数据的展示…

Redis-重定向

实验环境(3主3从的Redis-Cluster) 一、Redis重定向基础篇 1、MOVED重定向 Redis Custer 中,客户端可以向集群中任意节点发送请求。此时当前节点先对 Key 进行 CRC 16 计算,然后按 16384 取模确定 Slot 槽。确定该 Slot 槽所对应的…

postgresql之翻页优化

列表和翻页是所有应用系统里面必不可少的需求,但是当深度翻页的时候,越深越慢。下面是几种常用方式 准备工作 CREATE UNLOGGED TABLE data (id bigint GENERATED ALWAYS AS IDENTITY,value double precision NOT NULL,created timestamp with time zon…

AI大模型日报#0607:10家国产大模型、GPT-4o挑战高考作文 | OpenAI公开破解GPT-4新方法

导读:AI大模型日报,爬虫LLM自动生成,一文览尽每日AI大模型要点资讯!目前采用“文心一言”(ERNIE 4.0)、“零一万物”(Yi-Large)生成了今日要点以及每条资讯的摘要。欢迎阅读&#xf…

新媒体暴力起号必备因素!沈阳新媒体运营培训学校

1周涨粉10w?这对普通人来说可以说是天文数字,但只要掌握方式方法,普通人也能做到! 面试经验丰富的人都深知,给面试官留下的第一印象相当重要,几乎决定了80%的面试机会。标题也是如此,在完成一篇…

【c语言】指针就该这么学(3)

🌟🌟作者主页:ephemerals__ 🌟🌟所属专栏:C语言 目录 一、函数指针 1.函数指针变量的创建 2.函数指针变量的使用 二、typedef关键字 三、函数指针数组 1.函数指针数组的概念 2.函数指针数…

SD卡格式化怎么恢复?一键扫描,轻松找回丢失的数据

SD卡格式化怎么恢复数据?在日常生活中,我们常常会使用SD卡来存储各种数据,如照片、视频、文档等。然而,当SD卡意外格式化或者出现其他问题时,里面的数据就会面临丢失的风险。 此时,如何恢复格式化的SD卡就…

webgl_clipping_stencil

ThreeJS 官方案例学习&#xff08;webgl_clipping_stencil&#xff09; 1.效果图 2.源码 <template><div><div id"container"></div></div> </template> <script> import * as THREE from three; // 导入控制器 import …

成都跃享未来教育咨询有限公司,值得信赖!

在浩渺的教育咨询市场中&#xff0c;成都跃享未来教育咨询有限公司以其独特的魅力和卓越的服务质量&#xff0c;成为了行业内的璀璨明星。作为一家致力于为学生提供全方位教育咨询服务的公司&#xff0c;成都跃享未来教育咨询有限公司始终坚持安全可靠的原则&#xff0c;为广大…

docker命令 docker ps -l (latest)命令在 Docker 中用于列出最近一次创建的容器

文章目录 12345 1 docker ps -l 命令在 Docker 中用于列出最近一次创建的容器。具体来说&#xff1a; docker ps&#xff1a;这个命令用于列出当前正在运行的容器。-l 或 --latest&#xff1a;这个选项告诉 docker ps 命令只显示最近一次创建的容器&#xff0c;不论该容器当前…

SAP ERP系统主要模块简介

SAP系统通过提供一系列高度灵活的模块&#xff0c;满足企业在不同业务领域的需求。这些模块不仅功能齐全且相对独立&#xff0c;但它们之间又能紧密协作&#xff0c;共同构筑一个协同高效的工作环境。 财务会计&#xff08;FI&#xff09;模块 它涵盖了总账、应收账款、应付账…