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

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

平衡二叉树

定义

平衡二叉树是二叉搜索树的一种特殊形式。二叉搜索树(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.rhkb.cn/news/344060.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python - 深度学习系列38 重塑实体识别5-预测并行化改造

说明 在重塑实体识别4中梳理了数据流,然后我发现pipeline的串行效率太低了,所以做了并行化改造。里面还是有不少坑的,记录一下。 内容 1 pipeline 官方的pipeline看起来的确是比较好用的,主要是实现了比较好的数据预处理。因为…

党史馆3d网上展馆

在数字化浪潮的推动下,华锐视点运用实时互动三维引擎技术,为用户带来前所未有的场景搭建体验。那就是领先于同行业的线上三维云展编辑平台搭建编辑器,具有零基础、低门槛、低成本等特点,让您轻松在数字化世界中搭建真实世界的仿真…

【SpringBoot】SpringBoot整合RabbitMQ消息中间件,实现延迟队列和死信队列

📝个人主页:哈__ 期待您的关注 目录 一、🔥死信队列 RabbitMQ的工作模式 死信队列的工作模式 二、🍉RabbitMQ相关的安装 三、🍎SpringBoot引入RabbitMQ 1.引入依赖 2.创建队列和交换器 2.1 变量声明 2.2 创建…

Python实现半双工的实时通信SSE(Server-Sent Events)

Python实现半双工的实时通信SSE(Server-Sent Events) 1 简介 实现实时通信一般有WebSocket、Socket.IO和SSE(Server-Sent Events)三种方法。WebSocket和Socket.IO是全双工的实时双向通信技术,适合用于聊天和会话等&a…

SwiftUI中Mask修饰符的理解与使用

Mask是一种用于控制图形元素可见性的图形技术&#xff0c;使用给定视图的alpha通道掩码该视图。在SwiftUI中&#xff0c;它类似于创建一个只显示视图的特定部分的模板。 Mask修饰符的定义&#xff1a; func mask<Mask>(alignment: Alignment .center,ViewBuilder _ ma…

AI论文速读 | 2024[KDD]GinAR—变量缺失端到端多元时序预测

题目&#xff1a;GinAR: An End-To-End Multivariate Time Series Forecasting Model Suitable for Variable Missing 作者&#xff1a;Chengqing Yu&#xff08;余澄庆&#xff09;, Fei Wang&#xff08;王飞&#xff09;, Zezhi Shao&#xff08;邵泽志&#xff09;, Tangw…

XML解析库tinyxml2库使用详解

XML语法规则介绍及总结-CSDN博客 TinyXML-2 是一个简单轻量级的 C XML 解析库,它提供了一种快速、高效地解析 XML 文档的方式。 1. 下载地址 Gitee 极速下载/tinyxml2 2. 基本用法 下面将详细介绍 TinyXML-2 的主要使用方法: 2.1. 引入头文件和命名空间 #i…

Docker 国内镜像源更换

实现 替换docker 镜像源 前提要求 安装 docker docker-compose 参考创建一键更换docker国内源 vim /docker_daemon.sh #!/bin/bash # -*- coding: utf-8 -*- # Author: make.han # Email: CIASM@CIASM # Date: 2024/06/07 # docker daemon.jsondaemon_json_file="/et…

js 选择一个音频文件,绘制音频的波形,从右向左逐渐前进。

选择一个音频文件&#xff0c;绘制波形&#xff0c;从右向左逐渐前进。 完整代码&#xff1a; <template><div><input type"file" change"handleFileChange" accept"audio/*" /><button click"stopPlayback" :…

大模型微调工具LLaMA-Factory docker安装、大模型lora微调训练

参考: https://github.com/hiyouga/LLaMA-Factory 报错解决: 1)Docker 构建报错 RuntimeError: can’t start new thread: https://github.com/hiyouga/LLaMA-Factory/issues/3859 修改后的Dockerfile: FROM nvcr.io/nvidia/pytorch:24.01-py3WORKDIR /appCOPY require…

el-input中change事件造成的坑

el-input中change事件造成的坑 一、change事件定义二、如果仅回车时候触发 一、change事件定义 仅在输入框失去焦点或用户按下回车时触发 二、如果仅回车时候触发 <el-inputv-model.trim"questionInput"placeholder"请输入你的问题&#xff0c;按回车发送&…

NDIS Filter开发-PNP响应和安装

NDIS filter驱动可能是最容易生成的驱动之一&#xff0c;如果你安装了VS 2015 WDK之后&#xff0c;你可以直接生成一个能运行的Filter驱动&#xff0c;它一般是ndislwf。 和大部分硬件不同&#xff0c;NDIS Filter驱动介于软件和硬件抽象层之上&#xff0c;它和硬件相关&…

2024年最新的软件测试面试总结(答案+文档)

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 测试技术面试题 1、什么是兼容性测试&#xff1f;兼容性测试侧重哪些方面&#xff1f; 参考答案&#xff1a; 兼容测试主要是检查软件在不同的硬件平台、软件平…

老师如何制作高考后志愿填报信息采集系统?

高考结束后&#xff0c;志愿填报成为学生们的头等大事。面对众多选择&#xff0c;如何高效、准确地填报志愿&#xff0c;是每个学生和家长都关心的问题。作为老师&#xff0c;能否利用现有的技术工具&#xff0c;帮助学生更好地完成志愿填报呢&#xff1f; 老师们需要一个能够…

[C#]使用OpenCvSharp图像滤波中值滤波均值滤波高通滤波双边滤波锐化滤波自定义滤波

在使用OpenCvSharp进行图像滤波处理时&#xff0c;各种滤波方法都有其特定的用途和效果。以下是对中值滤波、均值滤波、高通滤波、双边滤波、锐化滤波和自定义滤波的详细解释和归纳&#xff1a; 中值滤波&#xff08;MedianBlur&#xff09; 原理与作用&#xff1a;中值滤波是…

SpringBoot实现参数校验拦截(采用AOP方式)

一、AOP是什么&#xff1f; 目的&#xff1a;分离横切关注点&#xff08;如日志记录、事务管理&#xff09;与核心业务逻辑。 优势&#xff1a;提高代码的可读性和可维护性。 关键概念 切面&#xff08;Aspect&#xff09;&#xff1a;包含横切关注点代码的模块。通知&#xff…

leetcode-04-[24]两两交换链表中的节点[19]删除链表的倒数第N个节点[160]相交链表[142]环形链表II

一、[24]两两交换链表中的节点 重点&#xff1a;暂存节点 class Solution {public ListNode swapPairs(ListNode head) {ListNode dummyHeadnew ListNode(-1);dummyHead.nexthead;ListNode predummyHead;//重点&#xff1a;存节点while(pre.next!null&&pre.next.next…

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

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

第一个小爬虫_爬取 股票数据

前言 爬取 雪球网的股票数据 [环境使用]&#xff1a;python 3.12 解释器pycharm 编辑器 【模块使用】&#xff1a;import requests -->数据请求模块 要安装 命令 pip install requestsimport csv -->将数据保存到CSV表格中import pandas -->也可以将数据保…

VS2019 QT无法打开 源 文件 “QTcpSocket“

VS2019 QT无法打开 源 文件 "QTcpSocket" QT5.15.2_msvc2019_64 严重性 代码 说明 项目 文件 行 禁止显示状态 错误(活动) E1696 无法打开 源 文件 "QTcpSocket" auto_pack_line_demo D:\vs_qt_project\auto_pack_line_de…