AVL树删除算法的实现--长安大学毕业设计

AVL树删除 AVL Tree与BST 由于AVL树本身就是一颗自平衡的BST,因此其的删除比起BST仅仅多了删除后平衡的调整   查找: AVL树中一定不存在两个值大小相同的节点 从AVL树根开始向下搜索,根据意图删除值与当前节点值大小关系进行下一步操作: 1、  当前节点值大于意图删除值,保存当前节点并在当前节点的左子树中继续查找意图删除值 2、  当前节点值小于意图删除值,保存当前节点并在当 阅读详情

AVL树的删除算法的两种实现方法

本文是本人原创,当时作为长安大学高一凡老师带的学生,我的毕业设计就是做一个AVL 算法的演示软件。其中,AVL树的删除算法在度娘和 谷歌了很久都没有找到逻辑通畅或者说是我能够看懂的。后来,闭门造成,费了十几张A4纸才把算法设计出来。实现之后得到了老师的认同。非常的开心。之前我骗了大家,用网络上能搜到的算法来敷衍大家,一直觉得我的努力成果,不能让别人剽窃。但是,这么多年过去了。我觉得,我要和优快云上其他码农一样,需要具有分享精神。。。。

本文是当时我想投稿的一个草稿,只是当时太嫩,不敢投论文。。而且马上就毕业了,所以就一直没了下文。现,贡献该草稿,希望对要了解AVL树算法的同学有帮助。



  曾金龙                  高一凡

(长安大学信息工程学院软件工程系)

摘要:AVL树是一种重要的数据结构,凡是能够用二叉查找树的地方都能用AVL树代替,而且其效率最坏也是 .一般的数据结构书上通常都只介绍AVL树的插入算法。本文将讨论AVL树删除算法的递归和非递归实现及其可视化实现。

 

关键字:AVL树;删除;递归;非递归;可视化

 

 

1.删除结点的分类

对于要删除的结点设为E可以分为三种类型,如图1 所示

(1) 叶子结点

(2) 没有左子树且有右子树的结点

(3) 有左子树的结点

 

    对于叶子结点E可以直接删除,而对于只有右子树ER的结点可以将ER的值赋给E然后将ER释放并将E右孩子指空。

    对于第(3)种则要在EL中找到E的中序遍历的前驱结点。E的前驱结点为EL中值最大的结点。将前驱结点的值赋给E且删除前驱结点。

 

2 删除结点后的失衡类性及其调整

删除结点后可能导致其祖先结点的不平衡。由于左右对称,我们仅分析删除发生在右子树的情况。我们将各种情况删除前,删除后以及调整后整个过程的变化用图示的方法表示。

 

  图2.1描述的是在T的右子树TR中删除结点后导致T失衡,须进行R_Rotate(T)处理,处理之后各结点的平衡因子如图所示,且树不变矮。

   图2.2描述的是在T的右子树TR中删除结点后导致T失衡,须进行R_Rotate(T)处理,处理之后各结点的平衡因子如图所示,且树的高度减1 。

  图2.3描述的是在T的右子树TR中删除结点后导致T失衡,须进行LR_Rotate(T)处理,处理之后各结点的平衡因子如图所示,且树的高度减1 。           

图2.4描述的是在T的右子树TR中删除结点后导致T失衡,须进行LR_Rotate(T)处理,处理之后各结点的平衡因子如图所示,且树的高度减1 。


图2.5描述的是在T的右子树TR中删除结点后导致T失衡,须进行LR_Rotate(T)处理,处理之后各结点的平衡因子如图所示,且树的高度减1 。  

另外还有两种不发生失衡的情况如图2.6和图2.7所示  

图2.6描述的是在T的右子树TR中删除结点后的T的平衡因子变为1,树的高度不变

图2.7描述的是在T的右子树TR中删除结点后的T的平衡因子变为0,树的高度减1.

3 实现算法

 3.1 数据结构

template<typename T>struct BSTNode//平衡二叉树的结点类型结构体

{

       T data;//结点数据类型

       int bf;//结点的平衡因子,比二叉链表结点多此项

       BSTNode<T>*lchild,*rchild;//左右孩子指针

};

 

3.2 算法

  3.2.1 递归法

递归实现AVL树的结点删除的思想如下。

   在AVL树T上删除值为E的结点步骤如下:

(1)若树T为空,返回0退出否则到(2);

(2)比较T的数据和E,若相等跳到(3),若E小于T->data跳到(4),若E大于T->data则跳到(5)

(3)分析T结点的类型

(3.1)若T是叶子结点则直接删除,树变矮即lower=1;

(3.2)若T只有右子树TR则将右子树结点的值赋给T,删除TR结点将T->rchild=NULL,lower=1;

(3.3)若T有左子树,则找到其中序遍历的前驱结点P,将P结点值用临时变量temp保存,并且用指针Tptr保存T;递归删除结点P;将Tptr所指结点即原T结点的值更新为temp;

  (4)在左子树T->lchild中递归删除值为E的结点,若删除成功检查左子树是否变矮即lower的值是否为1;若lower=0返回0退出;若lower=1则进行失衡调整各种情况上文有分析

  (5)在右子树T->rchild中递归删除值为E的结点,若删除成功检查左子树是否变矮即lower的值是否为1;若lower=0返回0退出;若lower=1则进行失衡调整,各种情况上文有分析

 

3.2.2非递归法

非递归的算法思想如下。

在AVL树T上删除值为E的结点的步骤如下:

初始化一个栈s ;

 (1) 若树T为空则返回0退出否则跳到(2);

 (2) p为工作指针p=T;比较p的数据和E,若相等则跳到(3),若E小于p->data则跳到(4),若E大于p->data则跳到(5)

 (3) 分析p结点的类型

           (3.1)若p是叶子结点则直接删除,树变矮,

(3.1.1)若p是其父结点的左子树则lower=1;

(3.1.2)若p是其父结点的右子树则lower=2;

           (3.2) 若p只有右子树pR则将右子树结点的值赋给p然后删除删除pR,树变矮,lower的值 和(3.1)一样分析,之后不再特别说明则都和(3.1)处理一样。

           (3.3) 若p有左子树pL则将p和pL入栈,且用指针tempptr指向p即tempptr=p然后执行

                   q=TL ; While(q->rchild){q=q->rchild;s.push(q);}之后可以找到p的前驱结点q,将q的值赋给原p结点即tempptr->data=q->data,若q是叶子结点则直接删除否则将q的左子树代替q。树变矮且弹栈s.pop() ;然后执行如下循环体

                       (3.3.1)若栈不空且lower不为0则执行

                                   a.弹栈 q=s.top();s.pop();及其q的父结点fa=s.top();

                                     若fa=NULL则表明q是根结点则若要执行下面 b

                                     或c时不用在给lower赋值了。

                                   b.若lower=1 则表明左子树变矮,执行相应的失衡调整,并且调整过程中若导致q树变矮也得根据q为fa的左子树还是右子树将 lower=1或为lower=2;

                                   c. 若lower=2 则表明右子树变矮,执行相应的失衡调整,并且调整过程中若导致q树变矮也得根据q为fa的左子树还是右子树将 lower=1或为lower=2;

                   退出循环后返回0退出;

 (4)将p入栈且p=p->lchild;然后跳到(2);

 (5)将p入栈且p=p->rchild;然后跳到(2);

 

 

4实例分析

 

有如图3.1所示的AVL树

                            图3.1 

选择删除61结点后如

 

 

5结束语

无论是递归还是非递归实现AVL树的删除都比较复杂,将其总结为算法并配以图形化的实现使得AVL树的在课堂上讲解更为方便,继而有力的推广AVL树的应用。

      

6参考文献

严蔚敏,吴伟民.数据结构(C语言版)[M].北京:清华大学出版社,2007.

 


AVL树插入删除算法详解(有图) -- C++语言实现 一:AVL树介绍 AVL树本质上还是一棵二叉搜索树,它的特点是: 1.本身首先是一棵二叉搜索树。 2.带有平衡条件:每个结点的左右子树的高度之差的绝对值(平衡因子)最多为1。在本文中用分别用-1,0,1定义左边树高,等高,右边树高。平衡因子用m_bf表示。 也就是说,AVL树,本质上是带了平衡功能的二叉查找树(二叉排序树,二叉搜索树)。 二:插入算法 由于AVL树具有BST树的 阅读详情

相关推荐

AVL树的删除操作

AVL树的删除程序,包括完整的源代码和可执行程序

套接字编程简介

项目:UNIX网络编程 作者:曾金龙 供职(深圳迅雷网络技术)

MiniMicall的专栏 1245

分享通达信破解交易接口的使用!

那其实通达信破解交易接口的使用方法比较复杂,这里以MA均线指标为例子,只要理解了这些操作步骤,就可以很容易地使用其他指标包括自己编写的指标来进行交易。委托结果(包含委托编号), 需要分配 1024*1024 字节的空间。委托结果数组, 每项结果需要分配 1024*1024 字节的空间。0: 买入, 1: 卖出, 2: 融资买入, 3: 融券卖出,4: (市价委托)上海五档即成剩撤, 深圳五档即成剩撤。4: 买券还券, 5: 卖券还款, 6: 现券还券。0: 上海限价委托, 深圳限价委托。

1841085904的博客 2360

【数据结构】AVL树的删除(解析有点东西哦)

AVL树的删除,12种情况,举例进行图解与文字分析,最后总结有代码与图解,应该是最详细的解析。

Shun_Hua的博客 5701

在Docker中集成GPU监控体系

先上效果图 等文档整理出来再更

tamako0v0的博客 2471

获取车辆VIN等OBD信息

获取车辆如下OBD信息: VIN:Vehicle Identification Number CALID:Calibration Identifications CVN:Calibration verification number 一、SAE J1939协议 通过请求 CALIBRATION INFORMATION (DM19),获取CVN和CALID。 发送请求:18EA00F9 00 D3 00 应答:18EC0000 10 14 00 03 FF 00 D3 00 数据,BYTE1=0x10,表明

jianxuezixuan的博客 1万+

AVL树的删除

引言 AVL树的定义及性质及其重要的插入方法,我已在AVL树的插入一文中详细阐述过了,其中重要的旋转也已进行详细描述。 本文就不再赘述了,直接使用,要是不清楚的小伙伴,还请移步AVL树的插入再回头复习一下下。 AVL树的删除 AVL树的删除步骤如下: 寻找删除目标(存不存在,定位出目标) 判断删除目标的类型,使用转换的思路,将其转化为删除叶子 将删除目标与AVL树链接断开,调整平衡,完成删除 寻找删除目标 寻找删除目标的思路很简单,因AVL树也属于BST,因此寻找目标的做法与BST的删除思路基本一致。

qq_39208237的博客 5889

SpringCloud 2025王炸更新!GraalVM原生镜像启动速度提升90%实战

在当今云原生和Serverless架构盛行的时代,应用的启动速度已成为衡量技术栈竞争力的关键指标。传统SpringCloud应用由于依赖JVM的动态类加载、反射等机制,启动时间通常超过30秒,在Kubernetes滚动更新和函数计算场景下成为显著性能瓶颈。2025年,SpringCloud迎来里程碑式更新,通过深度集成GraalVM原生镜像技术,实现了启动速度提升90%的惊人突破,让SpringCloud应用正式进入"秒级启动"时代。

小筱在线博客 1100

【C++】AVL树插入删除

这是一篇深度剖析AVL的插入,删除,以及判断是否是AVL树为主体的内容,其中涉及到LL,RR,LR,RL旋转的详细讲解。并且这是用的三叉实现的AVL树。

fight_p的博客 2560

UE5 GAS实战:从零构建一个MOBA英雄技能系统

本文详细介绍了如何利用UE5的Gameplay Ability System(GAS)构建MOBA英雄技能系统,涵盖核心组件如Ability System Component和GameplayEffect的使用,以及技能冷却、资源管理和连招系统等高级功能的实现。通过实战案例和代码示例,帮助开发者快速掌握GAS在MOBA游戏开发中的应用。

weixin_29012765的博客 527

GNSS - PPP软件 - GAMP 在VS2019/2022下完成调试、跑通程序(超详细!)

WIN32;_DEBUG;_CONSOLE;O_WARNINGS;ENAGLO;ENACMP;ENAGAL;ENAQZS;NFREQ=3。

qq_43381998的博客 8251

AVL树删除,详细图解

AVL树删除节点的过程是,先找到该节点,然后进行删除。由于删除节点的位置不同,导致删除后节点进行移动的方式不同。删除节点的位置分为以下4类: 1.删除叶子结点。操作:直接删除,然后依次向上调整为AVL树。 2.删除非叶子节点,该节点只有左孩子。操作:该节点的值替换为左孩子节点的值,然后删除左孩子节点。【左孩子节点为叶子结点,所以删除左孩子节点的情况为第1种情况。】【为什么左孩子节点为叶子节点,...

醒醒 1万+

离散数学 --- 图论基础 --- 图的同构,通路与回路,可达性与最短通路

同一个图(这里的图是抽象的数学定义)可以有不同的图形表示方法1.重数:两点之间的平行边的个数1.得到 n!的过程,一个图中的一个结点在另一个图中对应的结点有n种可能(黄框中定义的图来讨论),这个对应好后下一个结点有 n - 1 种可能,再下一个有n-2种,直到最后一个为1,所有可能的结果就等于 n * (n - 1) *(n - 2)*....*1 = n!2.虽然说找对应结点很困难,但不是没有规律可循的。比如1.两个相互对应的结点的度数要相同;

qq_51947882的博客 7441

AVL树图解(插入与删除)

2 和 0或者-2 和 0的组合,这个时候就需要对parent和PRightPLeft平衡因子进行特殊处理。之前我们插入过后旋转玩就可以直接跳出循环,不需要再进行更新平衡因子了,但是删除不是,当我们旋转完之后还要继续往上更新平衡因子。因为我们旋转其实就是为了去平衡左右子树的高度差,例如原来平衡因子为:2,这代表我们右子树比左子树要高2,那么我们去旋转完之后可能变为 1 或者 0,所以我们还需要继续往上更新,直到parent的bf为1或者遍历到根节点了。什么时候需要更新平衡因子呢?更新完平衡因子为0。

anjibgdexuexi的博客 1234

zynq的irq_f2p 如何增加或修改中断引脚个数(宽度)

ZYNQ开发过程中,如果使用PL到PS的中断,会产生一个疑问,设置界面显示可以有[91:84]、[68:61]共16个中断引脚,但是并没有设置中断口的宽度,如果使用多个中断引脚,应该怎么办?如果通过concat连接多个引脚,则自动调整为对应的引脚数。例如连接3个中断信号,则自动调整为:IRQ_F2P[2:0]

FPGA艺术家的博客 837

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

【C++ 学习 ㉒】- 超详解 AVL 树的插入、平衡调整以及删除(含源代码)

超详解 AVL 树: 一、AVL 树的概念 二、AVL 树节点的定义 三、AVL 树的插入 四、AVL 树的平衡调整 五、AVL 树的删除 六、AVL 树的实现

melonyzzZ的博客 2513

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

AVL树之删除算法

1、AVL树删除 思路: (1)、首先找到要删除的结点;没找到,直接false返回退出即可; (2)、将其转化为只有一个分支的结点,前面的路径都要入栈, (3)、其父节点(parent)的平衡因子(根据父的左/右=p(要删除的结点),修改父的bf),有几种情况,i>父节点的bf=1/-1,代表原先有两个结点,现在剩下一个了,直接退出循环,不用再往上寻找更改bf了...

weixin_33742618的博客 442

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

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

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

【数据结构】数据结构核心考点:AVL树删除操作详解(附平衡旋转实例)

【数据结构】数据结构核心考点:AVL树删除操作详解(附平衡旋转实例) 详细介绍数据结构——第七章——查找——AVL树的删除操作的重要知识点……

蒙奇D索大的博客 1716

AVL树的插入与删除

AVL 树要在插入和删除结点后保持平衡,旋转操作必不可少。关键是理解什么时候应该左旋、右旋和双旋。在Youtube上看到一位老师的视频对这个概念讲解得非常清楚,再结合算法书和网络的博文,记录如下。 1.1 AVL 的旋转 一棵AVL树是其每个节点的左子树和右子树的高度差最多为1的二叉查找树(空树高度定义为-1)。AVL树插入和删除时都可能破坏AVL的特性,可以通过对树进行修正来保证特性,修正方

haliluya123a的博客 834

AVL树的删除操作 --- Part two

AVL树的内容就结束了。可以看到通过旋转操作,AVL树可以将查询效率始终控制在O(log n)。但在C++ STL中却并没有使用该树来构造map,set,而是使用红黑树。这位更是重量级,他的维护成本更低,删除效率更高,那他背后又是什么样的逻辑呢?👀。

BUG制造机的博客 1102

AVL树的插入和删除

1. 概述 AVL树是最早提出的自平衡二叉树,在AVL树中任何节点的两个子树的高度最大差别为一,所以它也被称为高度平衡树。AVL树得名于它的发明者G.M. Adelson-Velsky和E.M. Landis。AVL树种查找、插入和删除在平均和最坏情况下都是O(log n),增加和删除可能需要通过一次或多次树旋转来重新平衡这个树。本文介绍了AVL树的设计思想和基本操作。 2. 基本术语

Tim's Blog 2603

【数据结构】深入理解AVL树:实现和应用

AVL树是由两位苏联数学家Adelson-Velsky和Landis于1962年发明的,它的特点是能够在插入和删除节点时自动调整树的结构,以保持树的平衡性。在AVL树中,任意节点的左右子树高度差不超过1,这就保证了整棵树的高度始终保持在对数级别,从而保证了插入、删除和查找等操作的高效性。本篇博客深入介绍了AVL树,包括其原理、实现和应用。通过C++代码示例展示了AVL树的基本结构和操作,以及探讨了在计算机科学领域的广泛应用。整体内容帮助读者更好地理解和应用AVL树这一自平衡的二叉搜索树。

Colorful___的博客 1301

数据结构:AVLTree的插入和删除的实现

本篇博客作为AVL树的插入和删除的实现。如果代码实现有问题,还请大佬们指出。以上就是我对于AVLTree插入和删除的理解。!!

li209779的博客 1375

【高阶数据结构】平衡二叉树(AVL)的删除和调整

平衡二叉树节点的删除方法详细讲解;平衡二叉树的删除代码实现(C++);

更新C/C++,数据结构与算法,计算机视觉,深度学习,目标检测 2225

图解AVL树删除

AVL树删除节点的过程是,先找到该节点,然后进行删除。由于删除节点的位置不同,导致删除后节点进行移动的方式不同。删除节点的位置分为以下4类: 1.删除叶子结点。操作:直接删除,然后依次向上调整为AVL树。 2.删除非叶子节点,该节点只有左孩子。操作:该节点的值替换为左孩子节点的值,然后删除左孩子节点。【左孩子节点为叶子结点,所以删除左孩子节点的情况为第1种情况。】【为什么左孩子节点为叶子节点,...

Pinker_Q 1684

AVL树的 插入 和 删除

AVL树的 插入 和 删除

潜心钻研技术 2350
上一篇: 立帖为据,每日学习一课编程技术
下一篇: AVL树删除算法的实现
minimicall
博客等级 码龄18年 407粉丝 174原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值