AVL树删除算法的实现

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

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树的删除操作 AVL树的删除程序,包括完整的源代码和可执行程序 立即下载

相关推荐

面向多目标跟踪的数据关联方法研究综述

摘要:多目标跟踪技术在军事和民用领域具有广泛应用,其核心挑战在于数据关联问题。本文系统梳理了数据关联的主要解决方法,首次将经典算法分为确定性关联和概率性关联两大类。确定性关联(如NNDA、GNN、MHT)采用"硬分配"策略,计算效率高但易受噪声干扰;概率性关联(如PDA、JPDA、PMHT)通过"软分配"处理不确定性,更适合复杂场景。文章详细分析了各类算法的原理、适用条件和优缺点,并探讨了智能学习等新兴技术在视觉跟踪等领域的应用。研究指出,尽管随机集滤波等新方法出现,

qq_43416206的博客 1141

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

AVL₩ᅠム￧レト¥ネᅠ←ルᄂ￧ᆴラ₩ᄈユ￧レト¦ᄌᄂ￧ᄃヘ¥ᆴ゙￧ホᄚ₩ヨᄍ₩ᄈユ ←ᆱリ¦ᄌタ¥ヌᄀ  ₩ロᄒ←ヌム←ᄒル ￯ᄐネ←ユ﾿¥ᆴノ¥ᄂᄃ¥ᆳᆭ¦﾿ᄀ₩チᆵ¥ᄋᆬ￧ᄄヒ¥ᆳᆭ←ルᄁ│ᄑᆵ¦ᄏᄊ¥ᄋᆬ￧ᄄヒ￧ᄈᄏ￯ᄐノ ₩ムリ│ᆭチ￯ᄐレAVL₩ᅠム₩リᆵ¦ᄌタ￧ᄃヘ←ヌヘ│ᆭチ￧レト₩ユᄚ₩ヘᆴ￧ᄏモ₩゙ト￯ᄐフ¥ヌᄀ₩リᆵ│テᄑ¥ᄂ゚￧ヤᄄ¦ᄎフ¥マノ₩゚ᆬ₩ノᄒ₩ᅠ

MiniMicall的专栏 2133

边缘AI硬件风向:从专用芯片到端侧大模型

边缘AI硬件正呈现五大发展趋势:专用AI加速芯片(如华为昇腾、谷歌EdgeTPU)凭借高能效比成为主流;端侧大模型催生支持Transformer架构的新硬件需求;存算一体技术突破内存墙限制;FPGA和可重构计算提供灵活性;异构集成与Chiplet技术实现模块化设计。这些发展需要配套软件工具链支持,未来边缘设备将演变成具备本地智能的"智能体",竞争焦点转向算力、能效、易用性和成本的多维平衡。

qq_37027335的博客 348

套接字编程简介

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

MiniMicall的专栏 1245

ABAP代码检查(Code Review)

1、SLIN 扩展程序检查 也可通过(SE38工具栏->检查-扩展程序检查) 进入 2、ATC 检查 通过<SE38菜单栏-检查-ABAP测试主控室> 或事物代码SCI, 支持自定义检查变式 SCI可以配置检查变式满足特殊需求,配置对象集用于批量检查 3、通过ABAP测试主控室实现统一管理,定期检查作业和监控功能(事务代码ATC) 参考 SLIN...

u012232542的博客 6069

Polyworks宏脚本开发入门:5分钟搞定环境搭建与基础命令录制

本文详细介绍了Polyworks宏脚本开发的入门指南,包括环境搭建、基础命令录制和核心对象操作。通过5分钟快速启动开发模式,掌握自动化操作流程和脚本调试技巧,帮助工程师高效完成工业测量与三维检测任务。

weixin_29306875的博客 537

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

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

Shun_Hua的博客 5702

提示deepseek生成完整的json用于对接外部API

通过精准的提示词设计(字段过滤、格式约束)、动态验证机制(自检与修正)和官方模板参考,可有效确保DeepSeek生成的JSON纯净无冗余。

神棍之路 2309

AVL树的删除

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

qq_39208237的博客 5889

11.3 海岛微电网与工业园区的构网应用

海岛微电网与工业园区配电网是构网技术下沉应用的两大典型场景。海岛微电网以构网型储能为核心,解决孤岛系统稳定性问题,需具备黑启动、多能源协调和故障穿越能力;工业园区则侧重电能质量治理、并离网无缝切换和经济优化运行。两类场景均需解决多机并联稳定性、故障特性适配和分层协同控制等关键技术。构网型变流器的电压源构建能力、自适应控制策略及飞轮储能等特殊应用,为构建高可靠性、高经济性的分布式能源系统提供了创新解决方案。

技术工作者 1086

Python爬虫经典案例第67篇:社交媒体平台爬取:Twitter数据采集实战

Twitter(现更名为X)是全球最具影响力的社交媒体平台之一,拥有超过3.3亿月度活跃用户。作为一个实时信息传播平台,Twitter上的数据涵盖了新闻、政治、娱乐、科技等各个领域,具有极高的研究价值:本文将深入探讨Twitter数据采集的技术方案,包括官方API调用、网页爬取和浏览器自动化三种方式。Twitter采用现代化的微服务架构,主要特点包括:Twitter作为全球最大的社交媒体平台,拥有完善的反爬机制:在开始爬取前,需要明确合法的数据采集方式:重要提示:未经授权爬取Twitter数据可能违反服务条

2201_76125261的博客 659

【C++】AVL树插入删除

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

fight_p的博客 2560

构建基于知识图谱的金融监管合规系统

金融行业是一个高度监管的领域,金融机构需要遵守众多复杂的法规和政策。传统的金融监管合规方式往往依赖于人工审查和简单的规则引擎,效率低下且容易出错。构建基于知识图谱的金融监管合规系统的目的在于利用知识图谱强大的知识表示和推理能力,实现对金融业务数据的自动化分析和合规检查,提高监管合规的效率和准确性。本系统的范围涵盖了金融机构的各类业务,如银行业务、证券业务、保险业务等。

AI天才研究院 1168

AVL树的插入删除查找算法实现和分析-2(树高度法)

在前一篇文章(AVL树的插入删除查找算法实现和分析-1(平衡因子法))中,介绍了如何用平衡因子记录左右子树的高度差的方法来实现AVL树的插入删除和查找的算法,并分析了这种方法的一些缺陷,这里,我将会使用另一种方法来实现这些算法,而且个人觉得比前一篇文章的所写实现更加简单,思路更加清晰。 在介绍这种方法之前,先说说怎么样求一棵二叉树的高度(或深度)。其代码和解释如下: int BiTre

ljianhui的专栏 9402

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

AVL树的插入删除查找算法实现和分析-1(平衡因子法)

至于什么是AVL树和AVL树的一些概念问题在这里就不多说了,下面是我写的代码,里面的注释非常详细地说明了实现的思想和方法。 因为在操作时真正需要的是子树高度的差,所以这里采用-1,0,1来表示左子树和右子树的高度差,而没有使用记录树的高度的方法。 代码如下: #define FALSE 0 #define TRUE 1 #define LH 1 #define EH 0 #d

ljianhui的专栏 8784

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

【数据结构与算法】AVL树的插入与删除实现详解

​ 之前对 mapmultimapsetmultiset其底层都是按照二叉搜索树来实现的,但是二叉搜索树有其自身的缺陷,假如往树中插入的元素有序或者接近有序,二叉搜索树就会退化成单支树,时间复杂度会退化成O(N),因此mapset等关联式容器的底层结构是对二叉树进行了平衡处理,即采用平衡树来实现。​注意:因为 map和 set主要是用红黑树进行封装,所以这里的 AVL树我们主要是实现它的插入和删除和 operator[](因为 insert就是为了 operator[]

lirendada的博客 1545

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

AVL树的插入删除查找算法实现和分析-1

至于什么是AVL树和AVL树的一些概念问题在这里就不多说了,下面是我写的代码,里面的注释非常详细地说明了实现的思想和方法。 因为在操作时真正需要的是子树高度的差,所以这里采用-1,0,1来表示左子树和右子树的高度差,而没有使用记录树的高度的方法。 代码如下: typedef struct AVLNode {     DataType cData;     int nBf;       ...

weixin_33682719的博客 194

深度拆解Ardent的AVL树:4种旋转算法与删除平衡的实现原理

🌳 **Ardent** 是一个面向对象的 PHP 集合库,其中的 `AvlTree` 类完整实现了 AVL 树这种自平衡二叉搜索树:插入和删除时自动触发 **4 种旋转算法**(左旋、右旋、左右旋、右左旋)来保持树的平衡。本文带你从源码层面拆解 Ardent 的 AVL 树是如何完成旋转判断与删除后平衡修复的,帮助你真正看懂 PHP 数据结构库的设计思路。 ## 为什么从 Ardent 源码

gitblog_00092的博客 473

【数据结构】平衡二叉树之AVL树

平衡二叉排序树 平衡二叉排序树(Balanced Binary Sort Tree),上一篇博客【数据结构】二叉排序树BST讲了BST,并且在最后我们说BST上的操作不会超过O(h),既然树高这么重要,那么BBST的研究就是为了使得树的深度在可接受的范围内渐近意义下达到O(lgn) n个节点组成的二叉树,其高度为lgn取下限时,这棵树是理想平衡的,满足这样条件的树只有完全二叉树和满二叉树,这样

weiersyuan的专栏 3644

[日记]LeetCode算法·二十五——二叉树⑤ AVL树(插入+删除)附代码实现

AVL,二叉平衡树,二叉搜索树,二叉树,Leetcode,算法

Leafing_的博客 902

AVL树的基本知识

AVL树 在计算机科学中,AVL树是最先发明的自平衡二叉查找树。在AVL树中任何节点的两个子树的高度最大差别为1,所以它也被称为高度平衡树。增加和删除可能需要通过一次或多次树旋转来重新平衡这个树。AVL树得名于它的发明者G. M. Adelson-Velsky和E. M. Landis,他们在1962年的论文《An algorithm for the organization of informa...

唐昊 645

java算法- AVL树

当前节点的左子树高度减去右子树高度,高度在-1到1之间。 平衡二叉树(又称AVL树) 和AVL树的比较 AVL树是一棵严格的平衡树,它所有的子树都满足二叉平衡树的定义。因此AVL树高被严格控制在XXX,因此AVL树的查找比较高效。但AVL树插入、删除结点后旋转的次数比红黑树多。 红黑树用非严格的平衡来降低插入删除时旋转的次数。 因此,如果你的业务中查找远远多于插入、删除,那选AVL树; ...

灰猫 221

AVL树、红黑树

from:http://blog.youkuaiyun.com/liyong199012/article/details/29219261 在计算机科学中,AVL树是最先发明的自平衡二叉查找树。AVL树得名于它的发明者 G.M. Adelson-Velsky 和 E.M. Landis,他们在 1962 年的论文 "An algorithm for the organization of informa

basycai的博客 1718
上一篇: AVL树删除算法的实现--长安大学毕业设计
下一篇: 套接字编程简介
minimicall
博客等级 码龄18年 407粉丝 174原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值