「AVL旋转」存在的目的是什么?
一、「AVL旋转」存在的目的是什么
1、保持 AVL 树的平衡性
旋转的目的就是减少高度,通过降低整棵树的高度来平衡。哪边的树高,就把那边的树向上旋转。当一个节点的左右子树高度差超过 1 时,需要对该节点的子树进行旋转来保持 AVL 树的平衡性。通过旋转操作,左子树或右子树的高度得以平衡,从而避免了树的单侧或双侧失衡的情况。
2、维护 AVL 树的查找效率
AVL 树是一种非常高效的数据结构,它的查找、插入和删除等操作时间复杂度为 O(log n)。通过旋转操作,可以保证 AVL 树保持平衡,在查找、插入和删除操作时保持较高的效率。
二、AVL简介
在计算机科学中,AVL树是最先发明的自平衡二叉查找树。在AVL树中任何节点的两个子树的高度最大差别为1,所以它也被称为高度平衡树。增加和删除可能需要通过一次或多次树旋转来重新平衡这个树。AVL树得名于它的发明者G. M. Adelson-Velsky和E. M. Landis,他们在1962年的论文《An algorithm for the organization of information》中发表了它。
向AVL树插入可以通过如同它是未平衡的二叉查找树一样把给定的值插入树中,接着自底向上向根节点折回,于在插入期间成为不平衡的所有节点上进行旋转来完成。因为折回到根节点的路途上非常多有 1.5 乘 log n 个节点,而每次 AVL 旋转都耗费恒定的时间,插入处理在整体上耗费 O(log n) 时间。在平衡的的二叉排序树Balanced BST上插入一个新的数据元素e的递归算法可描述如下:若BBST为空树,则插入一个数据元素为e的新结点作为BBST的根结点,树的深度增1; 若e的关键字和BBST的根结点的关键字相等,则不进行; 若e的关键字小于BBST的根结点的关键字,而且在BBST的左子树中不存在和e有相同关键字的结点,则将e插入在BBST的左子树上,并且当插入之后的左子树深度增加(+1)时,分别就下列不同情况处理之:BBST的根结点的平衡因子为-1(右子树的深度大于左子树的深度,则将根结点的平衡因子更改为0,BBST的深度不变; BBST的根结点的平衡因子为0(左、右子树的深度相等):则将根结点的平衡因子更改为1,BBST的深度增1; BBST的根结点的平衡因子为1(左子树的深度大于右子树的深度):则若BBST的左子树根结点的平衡因子为1:则需进行单向右旋平衡处理,并且在右旋处理之后,将根结点和其右子树根结点的平衡因子更改为0,树的深度不变; 若e的关键字大于BBST的根结点的关键字,而且在BBST的右子树中不存在和e有相同关键字的结点,则将e插入在BBST的右子树上,并且当插入之后的右子树深度增加(+1)时,分别就不同情况处理之。
从AVL树中删除可以通过把要删除的节点向下旋转成一个叶子节点,接着直接剪除这个叶子节点来完成。因为在旋转成叶子节点期间非常多有 log n个节点被旋转,而每次 AVL 旋转耗费恒定的时间,删除处理在整体上耗费 O(log n) 时间。
在AVL树中查找同在一般BST完全一样的进行,所以耗费 O(log n) 时间,因为AVL树总是保持平衡的。不需要特殊的准备,树的结构不会由于查询而改变。(这是与伸展树查找相对立的,它会因为查找而变更树结构。)
三、AVL的旋转
AVL树的基本操作一般涉及运做同在不平衡的二叉查找树所运做的同样的算法。但是要进行预先或随后做一次或多次所谓的“AVL 旋转”。
假设由于在二叉排序树上插入结点而失去平衡的最小子树根结点的指针为a(即a是离插入点最近,且平衡因子绝对值超过1的祖先结点),则失去平衡后进行进行的规律可归纳为下列四种情况:
单向右旋平衡处理LL:由于在*a的左子树根结点的左子树上插入结点,*a的平衡因子由1增至2,致使以*a为根的子树失去平衡,则需进行一次右旋转操作单向左旋平衡处理RR:由于在*a的右子树根结点的右子树上插入结点,*a的平衡因子由-1变为-2,致使以*a为根的子树失去平衡,则需进行一次左旋转操作双向旋转(先左后右)平衡处理LR:由于在*a的左子树根结点的右子树上插入结点,*a的平衡因子由1增至2,致使以*a为根的子树失去平衡,则需进行两次旋转(先左旋后右旋)操作双向旋转(先右后左)平衡处理RL:由于在*a的右子树根结点的左子树上插入结点,*a的平衡因子由-1变为-2,致使以*a为根的子树失去平衡,则需进行两次旋转(先右旋后左旋)操作延伸阅读1:AVL树的特点
本身首先是一棵二叉搜索树。带有平衡条件,即每个结点的左右子树的高度之差的绝对值(平衡因子)非常多为1。
猜你喜欢LIKE
相关推荐HOT
更多>>
跳跃链表的构建思路是什么?
一、跳跃链表的构建思路跳表一般基于有序链表实现。首先是链表的排序问题,对于链表的来说,排序的问题其实等价于怎么找到新增节点的在有序链表...详情>>
2023-10-11 20:54:19
为什么二叉堆只能删除堆顶元素?
一、二叉堆只能删除堆顶元素的原因1、二叉堆的结构特性二叉堆是一种完全二叉树(或近似完全二叉树),节点从上到下、从左到右依次排列,不会出...详情>>
2023-10-11 20:16:26
为什么JavaScript绝大多数内置函数都是native code?
一、JavaScript绝大多数内置函数都是native code的原因1、提高程序执行效率首先,内置函数作为引擎内部的一部分,可以提高JavaScript程序的执行...详情>>
2023-10-11 19:07:07
敏捷开发怎么落地?
一、敏捷开发落地在敏捷开发落地的过程中,我们通常会采用 Scrum 的方式,所以我们以 Scrum 为例来为大家介绍敏捷开发的流程和场景,在这个过程...详情>>
2023-10-11 16:58:54热门推荐
Java里float在乘以5之后为什么会出现很多小数?
沸bug管理工具有哪几个?
热「AVL旋转」存在的目的是什么?
热常用的数据库管理系统有哪些?
新为什么sql数据库用B树索引,而不是用其他树型数据结构?
为什么说双端队列比栈和队列灵活,但实际却没有后两者有用?
跳跃链表的构建思路是什么?
广义表和树有什么区别?
为什么二叉堆只能删除堆顶元素?
为什么Java提供了多种数据结构而python和go没有?
计算机组成原理、数据结构、编译原理都是什么?
为什么JavaScript绝大多数内置函数都是native code?
wiki怎么建?
软件测试怎么写测试用例?
技术干货






