数据结构和算法-平衡二叉树(定义 插入 删除 时间复杂度)

文章目录

  • 平衡二叉树
    • 总览
    • 平衡二叉树的定义
    • 平衡二叉树的插入
    • 调整最小不平衡子树
      • 在A的左孩子的左子树中插入导致不平衡
      • 在A的右孩子的右子树中插入导致不平衡
      • 上述两种的代码思路
      • 在A的左孩子的右子树中插入导致不平衡
      • 在A的右孩子的左子树中插入导致不平衡
    • 填个坑
    • 练习
    • 查找效率分析
    • 小结
  • 平衡二叉树的删除
    • 删除的节点是叶子-例1
    • 删除的节点是叶子-例2
    • 删除的节点是叶子-例3
    • 删除的节点是叶子-例4
    • 删除的节点是有左右子树的-例5
    • 删除的节点是有左右子树的-例6
    • 小结

平衡二叉树

总览

在这里插入图片描述

平衡二叉树的定义

保存平衡查找长度小些
在这里插入图片描述

平衡二叉树的插入

插入后,再调整树使其恢复平衡。

在这里插入图片描述
调整过后发现恢复平衡
在这里插入图片描述

调整最小不平衡子树

在这里插入图片描述
规律
左孩子右旋
右孩子左旋
在这里插入图片描述

在A的左孩子的左子树中插入导致不平衡

在这里插入图片描述
关于为什么所有子树的高度都是h是因为如果h+1或者h-1,那么插入后要不最小不平衡子树不是A,要不插入后没有最小不平衡子树,要不在插入前就已经出现最小不平衡子树了。总而言之都不满足假设的情况

在A的右孩子的右子树中插入导致不平衡

与上面的情况差不多,只不过改的位置不一样而已
在这里插入图片描述

上述两种的代码思路

都是先更新A节点的子树为b的某个子树,然后再更新b的子树节点为f,最后再更新原来f的父节点中的子节点为b
在这里插入图片描述

在A的左孩子的右子树中插入导致不平衡

在这里插入图片描述
先左旋后右旋的结果
在这里插入图片描述
此时对应插入到c的左右子树两种情况
在这里插入图片描述

在A的右孩子的左子树中插入导致不平衡

在这里插入图片描述
先右旋再左旋的过程
在这里插入图片描述
在这里插入图片描述

填个坑

在这里插入图片描述
最小不平衡子树调整好后其父亲树都会调整平衡
在这里插入图片描述

练习

插入后,找到最小不平衡子树,让孩子旋转
在这里插入图片描述

在这里插入图片描述
再插入
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
再插入
在这里插入图片描述
在这里插入图片描述

查找效率分析

由平衡二叉树可知道高度为h的平衡二叉树的节点最少的话是由一个根节点和两个子树构成,其中一颗子树为高度为h-1的最少节点数所构成的平衡二叉树,此时可以满足该树深度为h,而另一颗子树为高度为h-2的最少节点数所构成的平衡二叉树即可,若也为h-1的最少节点数所构成的平衡二叉树,那么此时没必要,节点相比与高度为h-2的最少节点数所构成的平衡二叉树多了,所以为h-2的即可
在这里插入图片描述

小结

在这里插入图片描述

平衡二叉树的删除

删除节点后,也要维持平衡二叉树的平衡

在这里插入图片描述

删除的节点是叶子-例1

在这里插入图片描述

在这里插入图片描述

删除的节点是叶子-例2

先删节点
在这里插入图片描述
然后先上找到最小不平衡子树的根节点,同时找到该个头最高的儿子和孙子
在这里插入图片描述
根据孙子位置,调整
此时80左旋
在这里插入图片描述

删除的节点是叶子-例3

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

删除的节点是叶子-例4

在这里插入图片描述
在这里插入图片描述
此时调整完后发现不平衡了,此时从调整后的子树继续向上传导,找到最小不平衡子树
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
右旋后,不平衡特性没有向上传到了

删除的节点是有左右子树的-例5

两种顶替的策略
在这里插入图片描述
转换为删除的节点只有一个子树的类型
在这里插入图片描述
删除后
在这里插入图片描述
往上找最小不平衡子树,儿子左旋一次即可
在这里插入图片描述
在这里插入图片描述
没有向上传导

删除的节点是有左右子树的-例6

此时用后继节点顶替
在这里插入图片描述
转换为删除叶子节点
在这里插入图片描述
此时向北找到最小不平衡子树
此时孙子个头一样,所以选哪个作为个头最高的孙子
假设此时为右孙子为个头最高
此时儿子左旋一次即可
在这里插入图片描述
假设此时左孙子为个头最高

在这里插入图片描述
此时孙子先右旋
在这里插入图片描述
再左旋,此时不平衡无向上传导
在这里插入图片描述

小结

旋转后子树变矮导致上层祖先不平衡
注意平衡二叉树删除操作的时间复杂度和插入的时间复杂度是一样的
在这里插入图片描述

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

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

相关文章

锁相放大器(LIA)基本原理

本文介绍锁相放大器(LIA)基本原理。 锁相放大器(LIA),英文名称:Lock-In Amplifier,在微弱信号检测领域使用非常广泛,比如科研电生理信号测量,传感器信号测量等。本文从理论上分析锁相放大器(LIA)基本原理。 1.基本概…

vivado生成时钟分析

生成的时钟 本节讨论生成的时钟,包括: •关于生成的时钟 •用户定义的生成时钟 •自动衍生时钟 •自动衍生时钟 关于生成的时钟 生成的时钟在设计内部由称为时钟修改块(用于例如MMCM),或者通过一些用户逻辑。生…

如何在Linux中查看正在运行的进程以及过滤特定端口和进程名称

在Linux系统中,管理和监控正在运行的进程是非常重要的。以下是一些常用的命令和技巧,帮助你查看、筛选和管理Linux中的进程。 1. 查看所有正在运行的进程 使用ps命令 ps命令是查看进程状态的基本工具。以下是一些常见的用法: 显示当前终端…

NFS搭建

离线环境,提前在有网络的服务器上下载好需要的软件包 yum -y install nfs-utils rpcbind --downloadonly --downloaddir /root/nfs zip -r nfs.zip nfs/ registry.cn-beijing.aliyuncs.com/pylixm/nfs-subdir-external-provisioner:v4.0.0 #nfs 安装 unzip nfs.zi…

mysql 表锁 行锁

目录 表锁(Table Lock) 行锁(Row Lock) 进一步通过举例解释 update操作走的是什么锁 表锁示例: 行锁示例: MySQL 中常见的锁类型包括: 表锁(Table Lock) 是针对整个…

redisson 哨兵模式配置

背景&#xff1a;项目redis由集群改为哨兵模式&#xff0c;漏洞扫描未授权访问漏洞&#xff08;CNVD-2019-21763&#xff09;&#xff0c;要求对redis哨兵也设置密码&#xff0c;redisson依赖版本为3.11.5 spring-boot版本为2.1.13。 redisson依赖升级 <dependency>&l…

[JS设计模式]Command Pattern

文章目录 举例说明优点缺点完整代码 With the Command Pattern, we can decouple objects that execute a certain task from the object that calls the method. 使用命令模式&#xff0c;我们可以将执行特定任务的对象与调用该方法的对象解耦。 怎么理解 执行特定任务的对…

基于Java (spring-boot)的课程管理系统

一、项目介绍 ​近年来&#xff0c;随着网络学校规模的逐渐增大&#xff0c;人工书写数据已经不能够处理如此庞大的数据。为了更好的适应信息时代的高效性&#xff0c;一个利用计算机来实现学生信息管理工作的系统将必然诞生。基于这一点&#xff0c;设计了一个学生信息管理系统…

Mybatis基本操作

目录 准备工作 删除操作 预编译SQL 增加操作 获取返回的主键 更新操作 准备工作 准备数据库表 emp创建一个新的springboot工程&#xff0c;选择引入对应的起步依赖&#xff08;mybatis、mysql驱动、lombok&#xff09;application.properties中引入数据库连接信息创建对应…

html 内外边距区别以及解释

引入&#xff1a; 我们在之前的学习中学习了边框&#xff0c;我们发现只要是页面的标签元素&#xff0c;都可以实现边框的效果&#xff0c;那么接下来我们来讲解一个比较重要的知识点&#xff0c;边距&#xff0c;边距分为内边距和外边距&#xff0c;它们和边框一起是我们后面学…

Mybatis配置-映射器(mappers)

现在&#xff0c;我们已经配置了MyBatis的行为&#xff0c;准备定义我们的映射SQL语句。但首先&#xff0c;我们需要告诉MyBatis在哪里找到它们。在这方面&#xff0c;Java并没有提供很好的自动发现机制&#xff0c;所以最好的方法是直接告诉MyBatis在哪里找到映射文件。 您可以…

【delphi11】delphi基础探索【三、基础组件和事件】

目录 基础组件 1. TButton&#xff08;按钮&#xff09; 2. TLabel&#xff08;标签&#xff09; 3. TEdit&#xff08;编辑框&#xff09; 4. TMemo&#xff08;多行编辑框&#xff09; 5. TComboBox&#xff08;组合框&#xff09; 6. TCheckBox&#xff08;复选框&…

PSP - 蛋白质与蛋白质的扩散对接 DiffDock-PP 算法

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/135115528 DiffDock-PP is a new approach to rigid-body protein-protein docking that is based on a diffusion generative model that learns…

PHP数据格式化加,加‘‘引号处理

原数据格式: ABC20231217043116afj6J0I6WV ABC20231217043116dlSyOB5Tvx ABC202312170431166EbL7BbYOm ABC20231217043116troQuaKWzw ABC20231217043116o7ZELjjF7E ABC20231217043122FFp1CSPLQ2 ABC20231217043133uJIBKil3bC ABC202312170431337z4bZwGJVS ABC20231217043133fi…

软件工程快速复习(期末急救)

每个同学要假想自己是一个项目经理&#xff0c;去完成一个软件项目&#xff0c;比如医院管理系统&#xff0c;自动设备控制系统等&#xff0c;以面向结构的软件工程方法&#xff0c;说出完成项目的步骤&#xff0c;涉及到的具体技术。初步了解面向对象的方法的与面向结构的方法…

【java】java学习笔记

1. 快速入门 // Hello类 public class Hello {// main方法public static void main(String[] args) {System.out.println("hello world!");} } 在控制台输入以下命令&#xff0c;对.java文件&#xff08;源文件&#xff09;进行编译操作&#xff0c;生成Hello.clas…

每日一题,二维平面

给你 二维 平面上两个 由直线构成且边与坐标轴平行/垂直 的矩形&#xff0c;请你计算并返回两个矩形覆盖的总面积。 每个矩形由其 左下 顶点和 右上 顶点坐标表示&#xff1a; 第一个矩形由其左下顶点 (ax1, ay1) 和右上顶点 (ax2, ay2) 定义。 第二个矩形由其左下顶点 (bx1, …

初学gitrepo的种种

经过各种折腾之后&#xff0c;发现git其实还是很简单的&#xff1b; 首先你需要两台机器&#xff0c;一台作为服务器&#xff0c;一台作为开发机器&#xff0c;开发机器从服务器上拉取代码。 目 目录 git建仓 开发机器拉取代码 初始化仓代码 repo管理 repo工具的下载 …

汽车制造厂设备故障预测与健康管理PHM

在现代汽车制造工业中&#xff0c;设备的可靠性和稳定性对于保证生产线的高效运行至关重要。为了提高生产效率、降低维修成本以及确保产品质量&#xff0c;汽车制造厂逐渐采用设备故障预测与健康管理&#xff08;PHM&#xff09;系统&#xff0c;以实现对设备状态的实时监测和预…

算法基础之快速幂求逆元

快速幂求逆元 核心思想&#xff1a; 逆元&#xff1a; 逆元 ap-2 mod p #include<iostream>#include<algorithm>using namespace std;typedef long long LL;LL pmi(int a,int b,int c){LL res 1;while(b){if(b & 1) res res * a %c;b >> 1;a (LL)…