AVL树插入删除算法详解(有图) -- C++语言实现

c++ AVL树 插入 删除 AVL树的插入很简单,根据BST树的特性插入之后在回溯的过程中调整即可 AVL树的删除也不是很难,一共有三种情况 第一种是左子树为空(右子树为不为空无所谓) 第二种是右子树为空(此时左子树不为空) 这两种直接用另一半子树覆盖当前节点然后删除再回溯调整树即可 第三种是左右子数都不为空 这个情况首先找到要删除的节点,然后找到比该节点大的节点中最小的一个节点(右子树中最左边的节点),或者比该... 阅读详情

一:AVL树介绍

AVL树本质上还是一棵二叉搜索树,它的特点是:
1.本身首先是一棵二叉搜索树。
2.带有平衡条件:每个结点的左右子树的高度之差的绝对值(平衡因子)最多为1。在本文中用分别用-1,0,1定义左边树高,等高,右边树高。平衡因子用m_bf表示。
也就是说,AVL树,本质上是带了平衡功能的二叉查找树(二叉排序树,二叉搜索树)。

二:插入算法

由于AVL树具有BST树的特性,所以它的插入算法思路上和BST树基本步骤是相同的,不过在BST树插入算法的基础上增加了由于平衡因子的变动,平衡化平衡因子的步骤,使得整棵树达到平衡因子绝对值不超过1的高度平衡。

在AVL树插入的过程中,为了使树再次平衡,需要作相应的旋转,分为单旋转和双旋转。又细分为左旋转,右旋转,左右旋转,右左旋转。
下面将就其中的主要情况加以说明:
(1)左旋转
左旋转的情况如图所示:
当我们插入元素出现类似的情况时,就需要左旋转来出马了。ptr是传给旋转函数的参数,我们先让ptr走到它的右孩子,用ptr表示旋转后的最上面的节点(有可能为根节点),用sub_left表示旋转后位置在左侧的节点,sub_right表示旋转后位置在右侧的节点(该图还未出现)。下文同此处。当出现上图情况是,我们只需用sub_left替换ptr的左孩子即可,并修改相应的平衡因子。不过有一点很重要,ptr的左孩子并不一定像图中那样为空,所以若要有左孩子,需要先将左孩子赋给sub_left的右孩子。
代码体现如下:
template <typename T>
void avl_tree<T>::rotate_left(node_type *&ptr)
{
	auto sub_left = ptr;      //先指定sub_left
	ptr = ptr->right_child;   //ptr走到它的右孩子

	sub_left->right_child = ptr->left_child;   //将ptr的左孩子覆盖sub_left的右孩子
	ptr->left_child = sub_left;         //旋转
	sub_left->m_bf = ptr->m_bf = 0;    //调整平衡因子
}
(2)右旋转
右旋转和左旋转代码只是镜像关系,就不重述一遍了。
(3)先左旋,后右旋

我们插入时可能碰到上面的情况,可以针对3、7进行左旋转,sub_left替换ptr的左孩子,再对7、16进行右旋转,sub_right替换ptr的右孩子。注意,若ptr有左右孩子,要将ptr的左孩子挂在sub_left的右孩子上,将ptr的右孩子挂在sub_left的左孩子上。
不过双旋转需要注意的是,平衡因子的情况不会像单旋转那么简单了,还可能出现下面的情况:

在这种情况中,2和18结点都是必须的,否则新插入9元素会直接导致3、7、9不平衡,程序直接执行左单旋转,而我们现在要讨论的是双旋转。
图中新增元素9或5,则3、7先左旋转,7、16后右旋转。分情况如下:
1.ptr的平衡因子为0:
  ptr平衡因子为0时,如图2.1,经过双旋转后,参与旋转的节点平衡因子都为0。
2.ptr的平衡因子为1:
  ptr平衡因子为1时,如图2.2,经过旋转后,sub_right的平衡因子为0,sub_left的平衡因子为-1。
3.ptr的平衡因子为-1:
  ptr的平衡因子为-1时,如图2.3,经过旋转后,sub_right的平衡因子为1,sub_left的平衡因子为0。
上述三种情况概括了双旋转平衡因子的变化情况,代码体现如下:
template <typename T>
void avl_tree<T>::rotate_left_right(node_type *&ptr)
{
	auto sub_right = ptr;
	auto sub_left = ptr->left_child;
	ptr = sub_left->right_child;

	sub_left->right_child = ptr->left_child;
	ptr->left_child = sub_lef
算法导论番外篇:AVL树与其c++实现 手撕AVL树 阅读详情

相关推荐

使用C++实现AVL树模板

今天练习编写了一下AVL树。参考了Weiss的数据结构与算法C++描述版。上一个实现的一个一般的二叉搜索树,在使用的过程中可能会慢慢变得不平衡,这样很可能会降低查找、插入等等的效率,因此我们需要使用算法来实现树的平衡。AVL树是一种比较经典的平衡二叉搜索树,它规定每个节点的左子树和右子树的高度差最多为1,默认空树的高度为-1,这样能保证树的深度为O(logN),而且除了遍历,赋值,基本上所有树的操作都可以以时间O(logN)执行(当然插入和删除后因为要重新平衡树,可能时间会长于O(logN))。(Ps,上面

FS's Home 6183

C++实现AVL树

AVL树的名字来源于它的发明作者G.M. Adelson-Velsky 和 E.M. Landis。AVL树是最先发明的自平衡二叉查找树(Self-Balancing Binary Search Tree,简称平衡二叉树)。 一棵AVL树有如下必要条件: 1.它必须是二叉查找树。 2.每个节点的左子树和右子树的高度差至多为1。 左边二叉树的节点45左子树高度2,右子树高度0,...

番茄都是西红柿 2082

FPGA优质开源项目 – UDP万兆光纤以太网通信

本文开源一个FPGA项目:UDP万兆光通信。文章末尾有该工程源码获取方式,有需要的小伙伴可以点赞、分享支持一下~

cjx_csdn的博客 4766

Vivado2023.2与Vitis协同开发:从Hello World到BOOT.BIN的完整流程解析

本文详细解析了使用Vivado 2023.2与Vitis协同开发ZYNQ/MPSoC平台的完整流程。从环境安装、硬件设计、软件编写、在线调试到生成独立的BOOT.BIN启动文件,手把手指导开发者完成从Hello World到系统固化的全步骤,并提供了常见问题的避坑指南,帮助初学者快速掌握软硬件协同开发的核心技能。

weixin_29197051的博客 177

【Labview】对连续采集数据的一种采样方法

图1如图1,想要对这样一个连续信号进行数据点的采集,我根据网上收集到的方法,在此分享一下最终的结果。可以拓展结合文件的写入,完成对连续信号的采集和输出。 已知: 一个连续信号,如图1. 目标: 设定一定采集点个数、采集点时间间隔、和采集周期次数,得到这条连续信号的数据点,如图2. 图2 方法如下: 主要利用的是队列的方法。 在连续信号生成的时候,不断的写入队列,并且清除队列。 ...

李时珍食疗志的博客 1万+

手把手教你用TiggerRamDisk绕过iPhone/iPad激活锁(支持iOS16.3,Win/Mac双平台保姆级教程)

本文详细介绍了如何使用TiggerRamDisk工具绕过iPhone/iPad的激活锁,支持iOS16.3系统,并提供Windows和Mac双平台的保姆级教程。从工具准备、设备连接到核心解锁流程,一步步指导用户完成操作,帮助二手设备或旧设备重获新生。

weixin_29323493的博客 916

手把手教你学 MATLAB 实战训练(6.5):基础实战实例

MATLAB 是一款强大的数学软件,广泛应用于工程计算、信号处理、控制系统设计、图像处理等领域。学习 MATLAB 不仅可以提高你的编程技能,还能帮助你解决实际的数学和工程问题。下面我将通过几个实战训练实例来教你如何使用 MATLAB。

xiaoheshang_123的博客 367

汽车IVI中控开发入门及进阶(三):概述

开发板的作用当然是为了解决一些应用而设计的,主体是板,终极目的是应用,中间过程则是开发,是基于板的开发。可以和编译Linux内核一样,通过buildroot配置,menuconfig修改,编译出一个完整的可以直接烧写到芯片上运行的Linux系统软件(包含boot、kernel、rootfs以及rootfs中的各种库和应用程序)。所以这些实现都是建构在汽车中控开发板的解决方案上的,最核心的当然就是一颗中控主控芯片,这是一颗国产中控双核DA主控芯片,AECQ100认证的车规级芯片。Q:uboot的作用是什么?

码农17年的博客 1407

基于DRU-HVDC的构网型海上风电场环流机理仿真复现

本文介绍了基于DRU-HVDC的构网型海上风电场环流机理仿真模型的构建方法。主要内容包括: 完整的Simulink模型结构,包含主模型文件GFM_DRU_Main.slx和配置脚本GFM_DRU_Setup.m 系统参数设置,包括基础频率(20Hz)、电压基准值(690V)、功率基准值(2MVA)等 四种仿真场景配置:电压不平衡、相位不平衡、阻抗不平衡和频率不平衡 风力发电机(WT)子系统的详细构建步骤,包含电压源、输出阻抗和测量模块 变压器和DRU整流器的参数设置 该模型可用于研究构网型风电场的环流机理。

huanghm88的专栏 262

YOLOv8 置信度阈值 (conf) 和 IoU 阈值 (iou) 详解:如何平衡漏检与误检?

摘要 本文深入探讨了YOLOv8目标检测模型中两个关键参数——置信度阈值(conf)和IoU阈值(iou)的核心作用。文章从目标检测的基础概念出发,解释了置信度分数反映模型预测可靠性,IoU衡量预测框重叠程度。重点剖析了非极大值抑制(NMS)机制如何通过这两个阈值进行预测框筛选:置信度阈值作为初筛门槛,IoU阈值决定重叠框的取舍。通过生动比喻和可视化图表,阐述了合理调节这两个参数能有效平衡误检与漏检问题,是优化YOLOv8模型实际表现的重要技巧。全文以实践为导向,帮助开发者掌握成为"调参大师&qu

深耕 Vue 生态与 JS/TS 技术,聚焦组件封装、响应式原理、TS 类型设计,解析工程化配置与性能优化方案。同时分享 YOLOv8 目标检测实战、AI 大模型面试核心考点,以代码实例拆解技术实现与业务解法。 1251

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

上一篇: C++实现二叉排序树BSTree --插入删除摧毁查找等操作
下一篇: 无向图的邻接矩阵和邻接表实现各种操作 -- C++语言描述
FreeeLinux
博客等级 码龄11年 421粉丝 356原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值