首页 > 其他分享 >第8章. AVL树

第8章. AVL树

时间:2023-12-06 20:44:06浏览次数:18  
标签:失衡 图示 子树 AVL 平衡 节点

AVL树


AVL树是在二叉搜索树上加上自平衡的功能。

AVL树是最早发明的自平衡二叉搜索树之一。

AVL取名于两位发明者的名字:G.M.Aelson-Velsky和E.M.Landis。

1.1 平衡因子

平衡因子(Balance Factor):某节点的左右子树高度差

平衡因子 = 左子树高度 - 右子树高度

1.2 AVL树特点

  1. 每个节点的平衡因子只可能是1、0、-1(绝对值 <= 1,如果超过1,称之为"失衡")
  2. 每个节点的左右子树高度差的绝对值不超过1
  3. 搜索、添加、删除的时间复杂度是O(logn)

普通二叉搜索树与AVL树对比

1.3 添加导致的失衡

示例:往下面这棵子树中添加13

添加之前

添加之后

添加的最坏情况:可能会导致所有祖先节点都失衡。(红色的线所涉及的祖先节点都可能失衡)

父节点(12)、非祖先节点(4、6、8、16)都不可能失衡。

1.3.1 LL、RR、LR、RL总结
  • 在插入操作中,只要将最小不平衡子树调整平衡,则其他祖先节点都会恢复平衡。

  • 查找最小不平衡子树的方法:

  • 从插入的节点开始,找到第一个失衡的祖先节点。

  • 调整最小不平衡子树(g是最小不平衡子树的根节点)

  • LL—在g的左孩子的左子树中插入节点导致的不平衡

    • 调整:g的左孩子右上旋
    • 对g进行右旋转
  • RR—在g的右孩子的右子树中插入节点导致的不平衡

    • 调整:g的右孩子左上旋
    • 对g进行左旋转
  • LR—在g的左孩子的右子树中插入节点导致的不平衡

    • 调整:g的左孩子的右孩子,先左上旋再右上旋
    • 先对p进行左旋转,再对g进行右旋转
  • RL—在g的右孩子的左子树中插入节点导致的不平衡

    • 调整:g的右孩子的左孩子,先右上旋再左上旋
    • 先对p进行右旋转,再对g左旋转
  • 记忆:

  • 左孩子—右上旋

  • 右孩子—左上旋

  • 说明:n—node、p—parent、g—grandparent

  • p是g的左右子树中高度较高的那个节点

  • n是p的左右子树中高度较高的那个节点

1.3.2 LL图示

1.3.3 RR图示

1.3.4 LR图示

1.3.5 RL图示

1.4 删除导致的失衡

示例:删除子树中的16

删除之前

删除之后

删除节点之后可能会导致父节点祖先节点失衡(只有1个节点会失衡),其他节点,都不可能失衡。

1.4.1 LL图示

1.4.2 RR图示

1.4.3 LR图示

1.4.4 RL图示

1.5 总结

  • 添加
    • 可能会导致所有祖先节点都失衡
    • 只要让高度最低的失衡节点恢复平衡,整棵树就会恢复平衡【仅需O(1)次调整】
  • 删除
    • 可能会导致父节点或祖先节点失衡(只有1个节点会失衡)
    • 让父节点恢复平衡后,可能会导致更高层的祖先节点失衡【最多需要O(logn)次调整】
  • 平衡时间复杂度
    • 搜索:O(logn)
    • 添加:O(logn),仅需O(1)次的旋转操作
    • 删除:O(logn),最多需要O(logn)次的旋转操作

标签:失衡,图示,子树,AVL,平衡,节点
From: https://www.cnblogs.com/keyongkang/p/17880494.html

相关文章

  • ArravList,LinkedList,Vector的相同点与区别
    ArravList,LinkedList,Vector的特性ArrayList:动态数组,使用的时候,只需要操作即可,内部已经实现扩容机制。线程不安全有顺序,会按照添加进去的顺序排好基于数组实现,随机访问速度快,插入和删除较慢一点可以插入null元素,且可以重复Vector和前面说的ArrayList很是类似,这里说的也......
  • AVL添加和删除结点
    删除虽然,二叉排序树的插入都在叶子节点,但是删除却可以分为三种不同的情况;(1)删除的节点刚好是叶子结点——直接删除1if((*T)->lchild==NULL&&(*T)->rchild==NULL)2{3//为叶子结点,直接删除4TreeNode*temp=*T;5*......
  • C++AVL树和红黑树的模拟实现
    前言在二叉树的基础上,为了让搜索更加快捷,出现的二叉搜索树,二叉搜索树规定,二叉树的左子树的值一定都小于其父亲节点的值,所有右子树的值一定都大于其父亲节点的值,这样就保证了在查找某一个数据时,让时间复杂度最低为变为logn。一、二叉树两种特殊的二叉树1.满二叉树满二叉树每层的节......
  • AVL树节点插入方式解析(单旋转和双旋转)
    AVL树的规则在学习AVL树插入节点的方式之前,我们首先要理解为什么要出现AVL树,首先我们要知道的是AVL树是在二叉搜索树的基础上增加一些限制条件才完成的。那么AVL树就是为了处理二叉搜索树的缺点而出现的一棵树,那么普通的二叉搜索树的缺点是什么呢?假如往树中插入的元素有序或者接近......
  • 平衡二叉树AVL
    在计算机科学中,AVL树是最早被发明的自平衡二叉查找树。在AVL树中,任一节点对应的两棵子树的最大高度差为1,因此它也被称为高度平衡树。查找、插入和删除在平均和最坏情况下的时间复杂度都是$O(logn)$。所以我们可知,AVL树首先是二叉查找树(BST),不了解BST的同学可以了解一下,因为AVL树......
  • STL之AVL模拟的实现(万字长文详解)
    STL之AVL模拟的实现AVL树的概念为什么会有AVL树?在STL中对map/multimap/set/multiset其底层都是按照二叉搜索树来实现的,但是二叉搜索树有其自身的缺陷,假如往树中插入的元素有序或者接近有序,二叉搜索树就会退化成单支树,时间复杂度会退化成O(N),因此map、set等关联式容器的底层结......
  • 【数据结构】7.平衡搜索树(AVL树和红黑树)
    0.概述对于普通的搜索树,如果一直插入比第一个元素小的元素,它会退化成一个无限向左下角眼神的单链表,使得时间复杂度退化为O(n)。如果我们在插入时保持树的结构是平衡的,则可以保证查找、插入和删除的时间复杂度有对数级的时间性能,下面讲到的AVL树和红黑树都是平衡搜索树,通过旋......
  • laravle cookie
    Laravel是一个流行的PHP框架,提供了方便的缓存功能来加速应用程序。有时候我们需要更改缓存值,本文将介绍如何在Laravel中更改缓存值。一、了解Laravel缓存在Laravel中,我们使用Cache类来操作缓存。Laravel支持多种缓存驱动,包括文件缓存、数据库缓存、Redis缓存等。......
  • mavlink(四)C库接口使用
    1.库文件接口使用1.1.原理发送方发送数据,需要经历组包->格式转换->发包(根据链路类型调用相关发送接口)的过程;接收方接收数据,需要经历解包->msgId解析->具体消息处理的过程;1.2.接口需要关注的重点是发送数据,接收数据的流程。Mavlink提供了几类接口,简化了应用层收发数据的操......
  • mavlink(二)xml文件结构
    1.xml文件框架和语法1.1.文件结构MaVLinkXML文件的大致结构如下:下面列出了主要标签(所有标签都是可选的):include:此标签用于指定语支文件(dialect)中包含的任何其他xml文件。通常,语支文件将includecommon.xml,如上所示;可以使用多个<include></include>标记,以......