数据结构与算法之树(三)AVL树

article/2025/8/19 5:26:47

数据结构与算法之树

数据结构与算法之树(一)二叉树概念及遍历方式(图文并茂)

数据结构与算法之树(二)二叉查找树

数据结构与算法之树(三)AVL树

数据结构与算法之树(四)红黑树

数据结构与算法之树(三)AVL树

文章目录

  • 数据结构与算法之树(三)AVL树
    • 一、什么是平衡二叉树?
    • 二、什么是AVL树?
    • 三、AVL树的调整策略
      • 3.1 旋转操作
        • 3.1.1 左旋
        • 3.1.2 右旋
      • 3.2 需要调整的节点
      • 3.3 情况分类
        • 3.3.1 LL
        • 3.3.2 LR
        • 3.3.3 RR
        • 3.3.4 RL
    • 四、总结

一、什么是平衡二叉树?

上一篇文章在讲述二叉查找树的时候,在极端情况下二叉查找树的左右子树极不平衡,造成了搜索速率的低落,于是为了防止左右子树极不平衡的情况,有了平衡二叉查找树

所谓的“平衡”,没有一个绝对的测量标准,大致的意思是左右子树的高度差不多

不同的平衡条件,造就了不同的搜索、插入、删除的效率,以及不同的实现复杂度,常见的平衡二叉树有AVL树、红黑树等,本文将讲解AVL树

二、什么是AVL树?

AVL树规定,任何一个节点,左右子树的高度相差不大于1

如下图所示

在这里插入图片描述

左边的二叉树满足AVL树的要求,在插入值为2节点后,它不满足AVL树的要求了,因为值为4和5的节点它们的左右子树高度相差大于1

那么我们可以使用什么策略来进行调整,使其满足AVL树的要求呢?

三、AVL树的调整策略

将不平衡的二叉搜索树调整成AVL树,需要对指定节点进行旋转操作,下面先来讲以下旋转操作

3.1 旋转操作

旋转操作分为左旋和右旋

3.1.1 左旋

在这里插入图片描述

如上图所示,就是将3节点进行左旋操作

上图的操作中,是要进行左旋操作的节点它的右子节点没有左节点,也就是5节点没有左节点,设想一下如果5节点有左节点,那么对3节点进行左旋操作,会发生什么?

先想一下对下面这棵树的3节点进行左旋操作,会发生什么?

在这里插入图片描述

没错,会发生冲突,5节点会有两个左节点,这是二叉树不允许的,如下图所示

在这里插入图片描述

那么怎么解决冲突?

解决冲突的方法就是将冲突节点插入到指定位置,如上图,我们冲突的节点是4节点,而4节点5节点的左子节点,肯定比5节点小,那么在进行旋转之后,将4节点按二叉查找树的插入规则插入到5节点的左子树即可,如下

在这里插入图片描述

适当小结一下

左旋操作会有两种情况

1.要左旋节点的右子节点没有左子节点,这种情况下不会发生冲突

2.要左旋节点的右子节点左子节点,这种情况会发生冲突,解决冲突的方法就是将冲突节点插入到旋转后主节点的左子树

3.1.2 右旋

在这里插入图片描述

上图是对8节点进行右旋操作

如果5节点有右子节点,也会发生冲突,解决办法是将冲突节点插入到右子树中,如下所示

在这里插入图片描述

小结

右旋操作也有两种情况

1.进行右旋操作的节点的左子节点没有右子节点,这种情况不会发生冲突

2.进行右旋操作的节点的左子节点右子节点,这种情况会发生冲突,解决冲突的办法是将冲突的节点插入到旋转后主节点的右子树

在理解左旋和右旋操作后,下面将将讲解AVL的调整策略

3.2 需要调整的节点

首先我们讨论在插入一个节点,使得二叉树不在是AVL树的时候,我们需要对哪个节点作出调整?

首先我们来看一个例子

在这里插入图片描述

上述这个例子,在插入2节点后,二叉树不在是AVL树,此时是因为4节点5节点不满足AVL树的规定

这里我们要解决4节点,只要将4节点进行一次右旋操作,就可以解决问题,如下

在这里插入图片描述

我们可以得到一个规律是

需要调整的节点是不满足AVL树规定的节点中最深的那么节点(如4节点)

在清楚需要调整的节点后,我们来讲一讲需要调整的情况

3.3 情况分类

调整的情况可以分为4中

LL:插入节点在需要调整节点左子树的左子节点

LR:插入节点在需要调整节点左子树的右子节点

RR:插入节点在需要调整节点右子树的右子节点

RL:插入节点在需要调整节点右子树的左子节点

这四种情况都有各自的调整策略,下面将一一介绍

3.3.1 LL

在这里插入图片描述

对于这种情况,我们只需要将我们要调整的节点(4节点)进行一次右旋操作即可,如下

在这里插入图片描述

3.3.2 LR

在这里插入图片描述

对于这种情况,我们需要将调整节点(4节点)的左子节点(2节点)进行一个左旋,然后再对调整节点(4节点)进行一次右旋,如下

在这里插入图片描述

3.3.3 RR

在这里插入图片描述

对于这种情况我们只需要将调整节点(4节点)进行一次左旋即可,如下

在这里插入图片描述

3.3.4 RL

在这里插入图片描述

对于这种情况,我们需要将调整节点(4节点)的右子节点(6节点)进行一次右旋,然后对调整节点(4节点)进行一次左旋,如下

在这里插入图片描述

小结

AVL的调整策略有四种,LL、LR、RR、RL,其中LL和RR可以分为外侧调整,LR、RL可以分为内侧调整。对于外侧只需要进行一次单旋操作。对于内侧需要进行双旋,其中第一次将其变为外侧,第二次调整为AVL树

四、总结

本篇文章讲解了平衡二叉查找树和AVL树的概念,重点讲解了AVL树的调整策略,其中需要重点掌握的是旋转操作

好了,本文到此就结束了,下一篇文章将讲解红黑树


http://chatgpt.dhexx.cn/article/TmVccUw1.shtml

相关文章

C语言数据结构总结:树

树 一,树的定义二,树的基本术语三,二叉树的定义四,二叉树的性质和存储结构五,关于二叉树的算法 一,树的定义 树是n(n>0)个结点的有限集合。 若n0,称为空树。 若n>…

【C++从入门到入土】第二十一篇:二叉搜索树之AVL树

AVL树 文章目录 AVL树一、AVL树1.特点2.操作旋转插入删除查找 一、AVL树 在计算机科学中,AVL树是最先发明的自平衡二叉查找树。在AVL树中任何节点的两个子树的高度最大差别为1,所以它也被称为高度平衡树。增加和删除可能需要通过一次或多次树旋转来重新平…

数据结构--二叉搜索树

二叉搜索树 一丶概念以及特点二丶相关操作定义TreeMap类put()操作--插入节点get()操作--得到key对应的value值getOrDefault()操作containsKey()操作--检查key是否存在containsValue()操作--检查value是否存在remove()操作--删除操作思路(1)叶子结点&…

Java数据结构--树2

Java数据结构--树 一、平衡树1.1 2-3 查找树1.1.1 2-3查找树的定义1.1.2 查找1.1.3 插入1.1.3.1 向2-结点中插入新键1.1.3.2 向一棵只含有一个3-结点的树中插入新键1.1.3.3 向一个父结点为2-结点的3-结点中插入新键1.3.1.4 向一个父结点为3-结点的3-结点中插入新键1.3.1.5 分解…

数据结构之多路查找树

多路查找树 一、2-3树1.1 查找1.2 2-3树的插入实现1.3 2-3树的删除节点 二、2-3-4树三、总结 二叉排序树简单的实现在多数情况能够达到预期的查找效率,但是每个节点只能存储一个元素和只能有两个孩子,使得在大量数据下会造成二叉排序树的深度特别大&…

【数据结构 7】二叉查找树及其Java实现

【数据结构 1】顺序表及其Java实现 【数据结构 2】单向链表及其Java实现 【数据结构 3】双向链表及其Java实现 【数据结构 4】栈及其Java实现 【数据结构 5】队列及其Java实现 【数据结构 6】符号表及其Java实现(使用链表实现) 【数据结构 7】二叉查找树…

C++从入门到精通(第十篇) :二叉搜索树

二叉搜索树 一:二叉搜索树概念二: 二叉搜索树实现节点的定义二叉搜索树实现 三:二叉搜索树的应用四:二叉树有关面试题ps 很多小伙伴为了刷题发愁 今天为大家推荐一款刷题神奇哦:刷题面试神器牛客 各大互联网大厂面试真…

数据结构与算法之树(二)二叉查找树

数据结构与算法之树 数据结构与算法之树(一)二叉树概念及遍历方式(图文并茂) 数据结构与算法之树(二)二叉查找树 数据结构与算法之树(三)AVL树 数据结构与算法之树(四…

【算法修炼】二叉搜索树

学习自:https://labuladong.gitee.io/algo/2/19/26/ 二叉搜索树 一、BST的中序遍历230、二叉搜索树中第k小的元素(中等)1038、从二叉搜索树到更大和树(中等) 二、判断BST的合法性※98、验证二叉搜索树(中等…

数据结构(C语言)-树

树 一、树1、树的定义2、树的基本术语3、树结构和线性结构的比较 二、二叉树1、二叉树的定义2、二叉树的形态与树的形态3、二叉树的性质4 、二叉树的存储结构5、遍历二叉树6、二叉树的其他操作7、线索二叉树 三、树与二叉树的转换1、树转换成二叉树2、二叉树变树 四、哈夫曼树1…

【数据结构与算法】程序内功篇六--树

程序内功篇六--树 一、树1、树的含义2、树的特点(选看)3、树的逻辑结构 二、二叉树1、二叉树的含义2、二叉树性质3、二叉树-顺序存储4、二叉树-链式存储5、二叉树的遍历6、二叉树创建与遍历C程序的实现(1)二叉树的创建(2)前序遍历…

数据结构---与树相关的知识

与树有关的一系列知识: 树,二叉树,满二叉树,完全二叉树,文章还没完,我会后序补充的 一: 树(了解就行)1.1 概念1.2 一些与树相关的重要概念1.3 树的表示形式 二: 二叉树(非常重要,重点掌握)2.1 概念2.2 两种特殊的二叉树2.2.1 满二叉树2.2.2 完全二叉树 2.3 二叉树的性质2.4 二叉…

Java数据结构--树1

Java数据结构--树 一、二叉树入门1.1 树的基本定义1.2 树的相关术语1.3 二叉树的基本定义1.4 二叉查找树的创建1.4.1 二叉树的结点类1.4.2 二叉查找树API设计1.4.3 二叉查找树实现1.4.4 二叉查找树其他便捷方法1.4.4.1 查找二叉树中最小的键1.4.4.2 查找二叉树中最大的键 1.5 二…

树 一

文章目录 1.查找二分查找判定树 2. 树(Tree)2.1 树的术语2.2树的表示:儿子兄弟表示法 3. 二叉树(Binary Tree)3.1 特殊结构二叉树3.2 二叉树的性质3.3 二叉树的存储3.4二叉树的遍历 分层次组织管理上更有效地操作。 1.查找 静态查找&#xf…

树一:邂逅入门篇

一、树的概念 树是一种典型的非线性结构,是表达有层次特性的图结构的一种方法。 1.1 基本术语 术语描述空树当n0 时称为空树。根结点根结点是一个没有双亲结点的结点。一棵树最多一个。例如:A边结点之间的连线叶子结点没有孩子结点的结点。例如&#x…

树一:定义及存储

树的定义: 树是一种非线性的数据结构。树是由 n (n > 0) 个结点组成的有序集合。 如果 n 为0,称为空树;如果 n > 0, 则: 有一个结点称为根结点(root),它有直接后继,但没有直接…

mysql 创建索引规则

1、表的主键、外键必须有索引; 2、数据量超过300的表应该有索引; 3、经常与其他表进行连接的表,在连接字段上应该建立索引; 4、经常出现在Where子句中的字段,特别是大表的字段,应该建立索引; 5、…

mysql分区表之三:MySQL分区建索引,唯一索引

介绍 mysql分区后每个分区成了独立的文件,虽然从逻辑上还是一张表其实已经分成了多张独立的表,从“information_schema.INNODB_SYS_TABLES”系统表可以看到每个分区都存在独立的TABLE_ID,由于Innodb数据和索引都是保存在".ibd"文件当中&#…

分享mysql创建索引的3种方法

大家应该都知道索引的建立对于MySQL数据库的高效运行是很重要的,索引可以大大提升MySQL的检索速度,下面这篇文章主要给大家介绍了关于mysql创建索引的3种方法,需要的朋友可以参考下 1、使用CREATE INDEX创建,语法如下: 1 CREATE INDEX indexName ON tab…

js 监听浏览器刷新还是关闭事件

// $(window).bind(beforeunload,function(){return 您输入的内容尚未保存,确定离开此页面吗?;}); // window.onbeforeunload function() { return "确定离开此页面吗?"; }; // function myFunction() {return "自定…