平衡二叉树的一系列操作:删除、插入(在二叉排序树中插入新结点后,如何保持平衡)、调整平衡等等等

news/2024/5/19 3:41:05/文章来源:https://blog.csdn.net/qq_44423388/article/details/128435722

平衡二叉树的插入(在二叉排序树中插入新结点后,如何保持平衡)

  • 1.平衡二叉树的定义
  • 2.平衡二叉树的插入(调整最小不平衡子树A)
    • 2.1LL(在A的左孩子的左子树中插入导致不平衡)
    • 2.2RR(在A的右孩子的左子树中插入导致不平衡)
    • 2.3LR(在A的左孩子的右子树中插入导致不平衡)
    • 2.4RL(在A的右孩子的左子树中插入导致不平衡)
  • 3.平衡二叉树的所有操作代码

1.平衡二叉树的定义

平衡二叉树(Balanced Binary Tree),简称平衡树(AVL树):树上任一结点的左子树和右子树的高度之差不超过1。
结点的平衡因子=右子树高-左子树高。
平衡二叉树结点的平衡因子的值只可能是−1、0或1。

在这里插入图片描述
在这里插入图片描述
只要有任一结点的平衡因子绝对值大于1,就不是平衡二叉树。

2.平衡二叉树的插入(调整最小不平衡子树A)

在二叉排序树中插入新结点后,如何保持平衡?
查找路径上的所有结点都有可能受到影响。
从插入点往回找到第一个不平衡结点,调整以该结点为根的子树。
每次调整的对象都是“最小不平衡子树”

2.1LL(在A的左孩子的左子树中插入导致不平衡)

在这里插入图片描述

LL平衡旋转(右单旋转)。
由于在结点A的左孩子(L)的左子树(L)上插入了新结点,A的平衡因子由1增至2,导致以A为根的子树失去平衡,需要一次向右的旋转操作。
总结为如下三步:
①newroot指向B
②A结点向右下旋转成为B的右子树的根结点,而B的原右子树则作为A结点的左子树
③A的左孩子B向右上旋转代替A成为根结点
//右单旋转
AVLNode* AVLTree::RotateRight(AVLNode* ptr)
{
//1.AVLNode* newroot = ptr->leftchild;newroot->parent = ptr->parent;
//2.ptr->leftchild = newroot->rightchild;if (newroot->rightchild){newroot->rightchild->parent = ptr;}newroot->rightchild = ptr;AVLNode* parent = ptr->parent;if (parent == nullptr){root = newroot;}else{if (parent->leftchild == ptr){parent->leftchild = newroot;}else{parent->rightchild = newroot;}}
//3.ptr->parent = newroot;return newroot;
}

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

在这里插入图片描述

RR平衡旋转(左单旋转)。由于在结点A的右孩子(R)的右子树(R)上插入了新结点,A的平衡因子由-1减至-2,导致以A为根的子树失去平衡,需要一次向左的旋转操作。
具体操作步骤总结如下:
①newroot指向B
②将A结点向左下旋转成为B的左子树的根结点,而B的原左子树则作为A结点的右子树
③将A的右孩子B向左上旋转代替A成为根结点,
//左单旋转
AVLNode* AVLTree::RotateLeft(AVLNode* ptr)
{//1.AVLNode* newroot = ptr->rightchild;newroot->parent = ptr->parent;//2.ptr->rightchild = newroot->leftchild;if (newroot->leftchild != nullptr){newroot->leftchild->parent = ptr;}newroot->leftchild = ptr;//考虑ptr不为根的情况AVLNode* parent = ptr->parent;if (parent == nullptr){root = newroot;}else{if (parent->leftchild == ptr){parent->leftchild = newroot;}else{parent->rightchild = newroot;}}//3.ptr->parent = newroot;return newroot;
}

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

在这里插入图片描述
LR平衡旋转(先左后右双旋转)。由于在A的左孩子(L)的右子树(R)上插入新结点,A的平衡因子由1增至2,导致以A为根的子树失去平衡,需要进行两次旋转操作,先左旋转后右旋转。先将A结点的左孩子B的右子树的根结点C向左上旋转提升到B结点的位置,然后再把该C结点向右上旋转提升到A结点的位置。
在这里插入图片描述

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

在这里插入图片描述

RL平衡旋转(先右后左双旋转)。由于在A的右孩子(R)的左子树(L)上插入新结点,A的平衡因子由-1减至-2,导致以A为根的子树失去平衡,需要进行两次旋转操作,先右旋转后左旋转。先将A结点的右孩子B的左子树的根结点C向右上旋转提升到B结点的位置,然后再把该C结点向左上旋转提升到A结点的位置。
在这里插入图片描述

3.平衡二叉树的所有操作代码

平衡二叉树代码

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

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

相关文章

qt嵌入并运行外部exe

由于项目需要,要实现将一个外部exe运行在qt的窗口中。下面记录一下过程: 首先就是在qt中创建一个新项目 由于我这里没有用到画布,所以没有勾选Generate form 然后就会自动生成一个可运行的代码 然后将我下边的代码替换粘贴进去 #includ…

cubeIDE开发, UART的CubeMX及HAL库实现原理及底层分析

一、UART通信协议 UART通用异步收发器(Universal Asynchronous Receiver and Transmitter)是STM32 上常用的串行通信外设,可以灵活地与外部设备进行全双工数据交换,需要注意区别: 【1】USART-通用同步异步收发器(Universal Synchronous Async…

stm32f407VET6 系统学习 day04 DHT11 温湿度传感器

1.温湿度的一次完整的数据包括: 一次完整的数据传输为40bit,高位先出。 数据格式: 8bit湿度整数数据 8bit湿度小数数据 8bi温度整数数据 8bit温度小数数据 8bit校验(校验和的值是前四个字节数据的和) 用户MCU发送一次开始信号后,DHT11从低功耗模式转…

UDP协议在Windows上使用示例

UDP(User Datagram Protocol,用户数据报协议)是无连接的,因此在两个进程通信前没有握手过程。UDP协议提供一种不可靠数据传送服务,也就是说,当进程将一个报文发送进UDP套接字时,UDP协议并不保证该报文将到达接收进程。…

为什么要使用 Compose 来开发 Android ?

1. Compose诞生背景 近年来,以React为代表的声明式UI开发思想席卷了整个前端开发领域。客户端与前端在产品形态上非常相似,也希望借鉴这种全新的开发思想来提升客户端UI的开发效率和体验。在这个大背景下,Android与iOS平台相继发布了自己的声…

node.js+uni计算机毕设项目互联网教育系统小程序(程序+小程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置: Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术: Express框架 Node.js Vue 等等组成,B/S模式 Vscode管理前后端分离等…

Attetion is all you need论文阅读笔记

Attetion is all you need 参考:沐神( 沐神_论文精讲_Attention is all you need) 1、Abstract 主流的序列转录模型(给一个序列生成另一个序列,比如机器翻译,给一句英文,生成一句中文&#x…

Biotin-PEG-MAL,Maleimide-PEG-Biotin,生物素聚乙二醇马来酰亚胺

英文名称:Biotin-PEG-MAL,Maleimide-PEG-Biotin 中文名称:生物素聚乙二醇马来酰亚胺 Biotin-PEG-Mal,聚乙二醇化生物素对亲和素或链霉亲和素有很高的亲和力。生物素/亲和素体系在生物分子检测和分离中有着广泛的应用。马来酰亚胺…

【状态估计】电力系统状态估计中的异常检测与分类(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

LeetCode 1739. 放置盒子:数学 思维

【LetMeFly】1739.放置盒子 力扣题目链接:https://leetcode.cn/problems/building-boxes/ 有一个立方体房间,其长度、宽度和高度都等于 n 个单位。请你在房间里放置 n 个盒子,每个盒子都是一个单位边长的立方体。放置规则如下: …

408 考研《操作系统》第三章第二节:基本分页存储管理、两级页表、基本分段存储管理方式、段页式管理方式

文章目录教程1. 基本分页存储管理的基本概念1.1 连续分配方式的缺点1.2 把“固定分区分配”改造为“非连续分配版本”1.3 什么是分页存储1.4 如何实现地址的转换?1.5 逻辑地址结构1.6 重要的数据结构——页表1.7 知识回顾与重要考点2. 基本地址变换机构2.1 例题2.2 …

单链表的头插法与尾插法

一、基本概念 二、头叉法 该方法从一个空链表开始,生成新结点,并将读取到的数据存放到新结点的数据域中,然后将新结点插入到当前链表的表头。采用头插法创建单链表时,读入数据的顺序与生成单链表的元素顺序是相反的。 LinkList L…

JavaScript操作BOM对象

BOM:浏览器对象模型 window代表浏览器窗口 >window.alert(1) undefined >window.innerHeight //浏览器内部高度 242 >window.innerWidth 1229 >window.outerHeight //浏览器外部高度 824 >window.outerWidth 1536 Navigator,封装了浏…

Kafka消息写入流程

Kafka消息写入流程 0,写入消息简要流程图 1,从示例开始 在Kafka中,Producer实例是线程安全的,通常一个Producer的进程只需要生成一个Producer实例. 这样比一个进程中生成多个Producer实例的效率反而会更高. 在Producer的配置中,可以配置Producer的每个batch的内存缓冲区的大小…

DAY5 Recommended system cold startup problem

推荐系统的冷启动问题 推荐系统冷启动概念 ⽤户冷启动:如何为新⽤户做个性化推荐物品冷启动:如何将新物品推荐给⽤户(协同过滤)系统冷启动:⽤户冷启动物品冷启动本质是推荐系统依赖历史数据,没有历史数据⽆…

【工作流Activiti7】6、Activiti 7 源码学习

1. 启动分析 源码版本是 7.1.0.M6 首先从 ProcessEngineAutoConfiguration 开始 ProcessEngineAutoConfiguration 是activiti-spring-boot-starter 7.1.0.M6自动配置的入口类,在这里主要看 SpringProcessEngineConfiguration 主要是配置了自动部署 最最最重要的…

Linux网络编程之epoll多路转接服务器

Linux网络编程之epoll多路转接服务器 一、epoll的基本概念 epoll是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率,因为它会复用文件描述符集合来传递结果而不用迫使开发者每次等待…

算法 | 如何通过Math.random()方法实现X平方或更多次方的概率?

前言 本文主要介绍Java中Math.random()方法以及该方法的简单应用。 每种语言都有随机方法,在Java中的随机方法有Math.random()方法、Random类。 Math.random Math.random()方法的返回值的是double类型,其返回值的范围为[0,1),包含0&#…

KOOM线上APM监控最全剖析

APM,全称是Application Performance Management,也就是应用性能管理,这与我们平时写的业务可能并不相关,但是却承载着App线上稳定的责任。当一款App发布到线上之后,不同的用户有不同场景,一旦App出现了问题…

【nowcoder】笔试强训Day7

目录 一、选择题 二、编程题 2.1Fibonacci数列 2.2合法括号序列判断 一、选择题 1.JAVA属于( )。 A 操作系统 B 办公软件 C 数据库系统 D 计算机语言 计算机软件主要分为系统软件与应用软件两大类。系统软件主要包括操作系统、语言处理系统、数…