AVL树的研究

28、数据结构简化:深入理解链表与树 本文深入探讨了链表和树这两种核心数据结构,涵盖了单向链表、双向链表、循环链表的基本操作及其应用。同时详细介绍了二叉树、平衡二叉树(AVL树)、B+树等高级树结构,并提供了多种遍历、插入、删除及排序的实现代码。文章还进一步分析了线索树、B+树的操作流程以及B*树的特点,帮助读者全面理解数据结构的设计与优化方法。 阅读详情

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);

 

 

AVL树的删除、增加节点的程序 该程序包含AVL树的增加节点和删除节点的操作,用户根据提示先建立一颗AVL树,然后选择是删除节点操作还是增加节点操作来进行选择。 立即下载

相关推荐

基于FLUENT的圆柱绕流数值模拟与流场优化策略

本文详细介绍了基于FLUENT的圆柱绕流数值模拟方法与流场优化策略。从基础概念、建模技巧到湍流模型选择,全面解析了圆柱绕流模拟的关键技术,并提供了实用的网格划分和参数设置建议。通过具体案例展示了流动控制方法和优化流程,帮助工程师有效降低阻力系数,提升流场性能。

f6g7h8i9j的博客 706

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

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

Shun_Hua的博客 5701

获取B站某用户更多的关注数和粉丝数

获取B站某用户更多的关注数和粉丝数 相关记录 一、 前言 B 站最多只能翻 5 页用户的关注数和粉丝数,如何能够看到更多呢。 方法我也是从网上翻来的,记载博客里,算是我研究过这个话题了。 二、需要的东西 关注数的 api https://api.bilibili.com/x/relation/followings?vmid=2884629&pn=1&ps=20&order=desc&jsonp=jsonp 关注者(粉丝)的 api https://api.bilibili.

Enderman_xiaohei的博客 4821

AVL树的删除

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

qq_39208237的博客 5889

linux下redhat6.8(理论是都适用)安装oracle12c---详细教程

1、配置yum源 1)、删除Redhat自带的yum: (2)、上传centos的yum包,并按照顺序安装,所需的rpm包通过点击这里获取(放在oracle文件中的centos yum):上传到linux中 进行安装 yum包链接:https://pan.baidu.com/s/1TxciCWEd7d-d4kGoea0L1w 提取码:eufp `` --注意后面两个安装包一起安装 ## 3)、更改系统yum源: 编辑rhel-source.repo文件,将其中的$releas

z931407229的博客 1149

【MATLAB】嵌入式ADC/DAC控制工程

摘要:本文针对嵌入式ADC/DAC应用中存在的量化误差、采样噪声、输出漂移等问题,提出基于MATLAB的仿真优化方案。通过构建完整的ADC/DAC仿真模型,实现了采样建模、数字滤波、误差校准和闭环控制仿真。方案采用滑动平均滤波抑制ADC噪声,双校准参数补偿DAC固有误差,并将算法轻量化移植至STM32平台。实测表明,该方案使ADC采样波动从±25mV降至±5mV,DAC输出偏差从42mV降至18mV,显著提升了模拟量交互精度和系统稳定性。整套方案资源占用低,适配各类嵌入式高精度控制场景,具有较高的工程应用价

unber的博客 650

AVL树删除,详细图解

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

醒醒 1万+

Android Binder——数据传递载体(二十一)

同一进程间的对象传递都是通过引用来做的,因而本质上就是传递了一个内存地址。而跨进程采用了虚拟内存机制,两个进程都有自己独立的内存地址空间,所以跨进程传递的地址值是无效的。进程间的数据传递是 Binder 机制中的重要一环,Android 系统中担负这一重任的就是 Parcel。Parcel 是一种数据的载体,用于承载希望通过 IBinder 发送的相关信息(包括数据和对象引用)。正是基于 Parcel 这种跨进程传输数据的能力,进程间的 IPC 通信才能更加平滑可靠。

小旭的专栏 576

AVL树图解(插入与删除)

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

anjibgdexuexi的博客 1234

芒果YOLOv1改进35:主干Backbone篇之MobileViTv3:全网首发最新 MobileViTv3 系列最强改进版本(三)|轻量化Transformer视觉转换器,简单有效地融合了本地全局

芒果YOLOv1改进35:主干Backbone篇之MobileViTv3:全网首发最新 MobileViTv3 系列最强改进版本(三)|轻量化Transformer视觉转换器,简单有效地融合了本地全局

包括YOLOv5、YOLOv7、YOLOv8等模型改进 419

ABB机器人将实时坐标发送给西门子PLC的具体方法示例

ABB机器人将实时坐标发送给西门子PLC的具体方法示例

Robot_PLC_HMI_Automation 4914

图解AVL树删除

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

Pinker_Q 1684

彻底解决tplink路由器无法访问部分https网站

彻底解决tplink无法访问部分https网站

renkai721的专栏 8765

平衡二叉树研究(AVL树)

最近在研究数据结构,使用教材是程杰的《大话数据结构》,这本树写的非常好,看到了平衡二叉树,对该章研究了下,敲了下代码,并通过加断点调试,学习了不少,记录下来,供大家参考。

FreeCloud_InSky的专栏 811

IEM模型,地表粗糙度模拟

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

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

数据结构与算法系列研究五——树、二叉树、三叉树、平衡排序二叉树AVL

树、二叉树、三叉树、平衡排序二叉树AVL 一、树的定义 树是计算机算法最重要的非线性结构。树中每个数据元素至多有一个直接前驱,但可以有多个直接后继。树是一种以分支关系定义的层次结构。 a.树是n(≥0)结点组成的有限集合。{N.沃恩} (树是n(n≥1)个结点组成的有限集合。{D.E.Knuth}) 在任意一棵非空树中: ⑴有且仅有一个没有前驱的结点...

weixin_30344995的博客 1235

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

深入理解AVL树

AVL树的插入和删除操作是它很普遍的操作,我从一些文章上看到都说它的删除操作机及其复杂,但是这个世界上难道还有比毁灭更简单的事情吗?avl删除的善后处理真的比插入一个节点还要复杂吗?经过我的百般蹂躏,avl树终于向我展示了冰山的下面到底隐藏着什么。 本文转自 dog250 51CTO博客,原文链接:http://blog.51cto.com/do...

weixin_34066347的博客 91

Python之AVL树

文章目录AVL树(平衡二叉树)总结 AVL树(平衡二叉树) 方法 功能 find(data) 查找值为data的节点是否存在树中 height() 返回当前树高 insert(data) 插入值为data的节点 delete(data) 删除值为data的节点 get_pre(root) 返回root节点的前驱 inorder(root) 中序遍历 #节点类。AVL树相对一般二叉搜索树,节点增加树高属性,便于判断是否平衡,从而决定是否进行调整等。 class Node

Cauchy的博客 1512

2015广工数据结构实验平衡二叉树:深入理解AVL树的实现与应用

2015广工数据结构实验平衡二叉树:深入理解AVL树的实现与应用 去发现同类优质开源项目:https://gitcode.com/ 在计算机科学中,数据结构是构建高效程序的基础。2015广工数据结构实验平衡二叉树项目,是一个专注于研究平衡二叉树(AVL树)的实验项目。以下是该项目的详细解读,帮助您深入理解并应用于实际编程。 项目介绍 2015广工数据结构实验平衡二叉树,旨在通过实现平衡二叉树的基本...

gitblog_06745的博客 362

1066 Root of AVL Tree——PAT甲级 | 参考mooc实现完整代码

1066 Root of AVL Tree——PAT甲级,AVL树的构建,参考浙大MOOC视频,对MOOC中不完整代码进行补充(C语言)。

qq_40481602的博客 254

PAT1066--Root of AVL Tree (25)

数据结构树的综合

Keep coding 588

JAVA实现AVL树的重构,解决因为添加和删除导致的失衡问题_avl树节点删除引发失衡,旋转重新平衡后子树高度(2)

这个大家可以参照LR。

2401_84925367的博客 1189

计算机学科专业基础综合试题及答案,考研统考408计算机学科专业基础综合真题及答案..doc...

2015 年全国硕士研究生入学统一考试计算机学科专业基础综合试题一、单项选择题:140小题,每小题2分,共80分。下列每题给出的四个选项中,只有一个选项符合题目要求。请在答题卡上将所选项的字母涂黑。1.已知程序如下: int s(int n){return (n<=0) ? 0 : s(n-1) +n;}void main(){cout<< s(1);}程序运行时使用栈来保存调用...

weixin_35368330的博客 944

AVL树和红黑树

AVL树是由二叉搜索树引出来的,在二叉搜索树中,顺序插入时会导致树变成单枝树,查询效率变低,所以要使用另一种方法来进行改变树的结构,当该节点的平衡因子变为1或-1时,说明树的高度变了,向上更新,出现了平衡因子为2的节点,需要进行旋转处理。因此,我们引入了平衡因子,当平衡因子为2或-2时,就可以对树进行调整了;插入:新节点插入后,可能会出现AVL的某个节点变为2或-2;插入后:pparent的平衡因子可能出现的情况:1,0,-1;比如当一边树的高度比另一边高2时,就可以进行对树进行调整。

z20050930的博客 200

二叉树判断平衡性算法实现

在实际应用中,需要根据具体的应用场景选择合适的数据结构,并采用有效的算法来实现平衡性的维护。通过深入理解与参考本文的技术总结,读者可以更好地掌握二叉树判断平衡性的算法实现,为相关领域的研究与应用提供有益的参考。AVL 树是一种自平衡的二叉搜索树,它的基本原理是维持两个主要属性——树的平衡性和节点旋转的有效性。在实际的实现过程中,可以通过维护节点的高度信息以及一系列的操作来保证树的平衡性。对于二叉树判断平衡性的算法实现,不仅关系到二叉树性能的优劣,还直接影响到算法的效率与稳定性。2. AVL 树的算法实现。

2501_90410679的博客 66

【数据结构】平衡树

平衡树作为数据结构领域的重要成员,以其独特的自平衡特性,为数据的存储、检索和动态更新提供了高效的解决方案。我们深入剖析了常见的平衡树类型,如严格平衡的 AVL 树、近似平衡的红黑树以及结构独特的 2 - 3 树,了解了它们各自的平衡策略、插入删除等操作原理。在实际应用中,平衡树在数据库索引、搜索引擎等关键领域发挥着不可替代的作用,大大提升了系统的性能和效率。然而,平衡树的知识体系远不止于此,它还有许多值得我们深入探索的地方。

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值