面试官提到的 AVL 树,到底是个啥(上)

简介: 了解过平衡二叉树的朋友们,对它一定有印象,今天阿粉就与大家一起深入了解一下AVL树!

一、摘要

在上篇文章,我们详细的介绍了二叉树的算法以及代码实践,我们知道不同的二叉树形态结构,对查询效率也会有很大的影响,尤其是当树的形态结构变成一个链条结构的时候,查询最后一个元素的效率极底,如何解决这个问题呢?

关键在于如何最大限度的减小树的深度,从而提高查询效率,正是基于这一点,平衡二叉查找树出现了!

平衡二叉查找树,算法由Adel'son-Vel'skiiLandis两位大神发明,同时也俗称AVL 树,来自两位大神的姓名缩写,特性如下:

  • 它的左子树和右子树都是平衡二叉树;
  • 且它的左子树和右子树的深度之差的绝对值(平衡因子 ) 不超过1;

简单的说,就是为了保证平衡,当前节点的左子树、右子树的高度差不超过1!

废话也不多说了,直奔主题,算法思路如下!

二、算法思路

平衡二叉查找树的查找思路,与二叉树是一样,每次查询的时候对半分,只查询一部分,以达到提供效率的目的,插入、删除也一样,最大的不同点:每次插入或者删除之后,需要计算节点高度,然后按需进行调整!

如何调整呢?主要方法有:左旋转、右旋转!

下面我们分别来分析一下插入、删除的场景调整。

2.1、插入场景

我们来分析一下插入的场景,如下:

场景一

当我们在40的左边或者右边插入的时候,也就是50的左边,只需绕80进行右旋转,即可达到树高度差不超过1!

54.jpg

场景二

当我们在60的左边或者右边插入的时候,也就是50的右边,需要进行两次旋转,先会绕50左旋转一次,再绕80右旋转一次,即可达到树高度差不超过1!

55.jpg

场景三

当我们在120的左边或者右边插入的时候,也就是90的右边,只需绕80进行左旋转,即可达到树高度差不超过1!

56.jpg

场景四

当我们在85的左边或者右边插入的时候,也就是90的左边,需要进行两次旋转,先会绕90右旋转一次,再绕80左旋转一次,即可达到树高度差不超过1!

57.jpg

总结

对于插入这种操作,总共其实只有这四种类型的插入,即:单次左旋转、单次右旋转、左旋转-右旋转、右旋转-左旋转,总结如下:

  • 当插入节点位于需要旋转节点的左节点的左子树时,只需右旋转;
  • 当插入节点位于需要旋转节点的左节点的右子树时,需要左旋转-右旋转;
  • 当插入节点位于需要旋转节点的右节点的右子树时,只需左旋转;
  • 当插入节点位于需要旋转节点的右节点的左子树时,需要右旋转-左旋转;

2.2、删除场景

接下来,我们分析一下删除场景!

其实,删除场景跟二叉树的删除思路是一样的,不同的是需要调整,删除的节点所在树,需要层层判断节点的高度差是否大于1,如果大于1,就进行左旋转或者右旋转!

场景一

当删除的节点,只有左子树时,直接将左子树转移到上层即可!

58.jpg

场景二

当删除的节点,只有右子树时,直接将右子树转移到上层即可!

59.jpg

场景三

当删除的节点,有左、右子树时,因为当前节点的左子树的最末端的右子树或者当前节点的右子树的最末端的左子树,最接近当前节点,找到其中任意一个,然后将其内容替换并移除最末端节点,即可实现删除!

60.jpg

总结

第三种场景稍微复杂了一些,但基本都是这么一个套路,与二叉树不同的是,删除之后需要判断树高,对超过1的进行调整,类似上面插入的左旋转、右旋转操作!

相关文章
|
5月前
|
机器学习/深度学习 存储 算法
机器学习面试笔试知识点-决策树、随机森林、梯度提升决策树(GBDT)、XGBoost、LightGBM、CatBoost
机器学习面试笔试知识点-决策树、随机森林、梯度提升决策树(GBDT)、XGBoost、LightGBM、CatBoost
223 0
|
2月前
|
人工智能 算法
【数据结构入门精讲 | 第十三篇】考研408、公司面试树专项练习(二)
【数据结构入门精讲 | 第十三篇】考研408、公司面试树专项练习(二)
29 0
|
2月前
|
机器学习/深度学习 存储 算法
【数据结构入门精讲 | 第十二篇】考研408、公司面试树专项练习(一)
【数据结构入门精讲 | 第十二篇】考研408、公司面试树专项练习(一)
19 0
|
3月前
|
JavaScript 算法 前端开发
面试题:vue2和vue3区别、vue3项目的打包体积为什么减少40%、vue2和vue3同样可以使用TS开发,为什么vue3就易于扩展呢?vue3的摇树优化是怎么样的优化过程?
面试题:vue2和vue3区别、vue3项目的打包体积为什么减少40%、vue2和vue3同样可以使用TS开发,为什么vue3就易于扩展呢?vue3的摇树优化是怎么样的优化过程?
58 0
|
3月前
|
存储 算法 关系型数据库
【面试普通人VS高手系列】b树和b+树的理解
【面试普通人VS高手系列】b树和b+树的理解
|
3月前
|
SQL 数据挖掘 数据处理
「SQL面试题库」 No_36 树节点
「SQL面试题库」 No_36 树节点
|
8月前
|
算法
面试还在被红-黑树虐?看完这篇轻松搞定面试官(二)
面试还在被红-黑树虐?看完这篇轻松搞定面试官
面试还在被红-黑树虐?看完这篇轻松搞定面试官(二)
|
8月前
|
前端开发
头条面试题:计算目录树的深度
头条面试题:计算目录树的深度
60 0
面试还在被红-黑树虐?看完这篇轻松搞定面试官(一)
面试还在被红-黑树虐?看完这篇轻松搞定面试官
|
8月前
|
存储 缓存 Java