AVL树面试题及详细答案(实战版)_第1页
AVL树面试题及详细答案(实战版)_第2页
AVL树面试题及详细答案(实战版)_第3页
AVL树面试题及详细答案(实战版)_第4页
AVL树面试题及详细答案(实战版)_第5页
已阅读5页,还剩3页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

AVL树面试题及详细答案(实战版)一、基础概念面试题(入门必问)1.什么是AVL树?核心特性是什么?参考答案:AVL树是自平衡二叉搜索树,是最早的平衡二叉树结构。它在普通二叉搜索树(BST)的基础上,增加了严格的平衡约束,解决了普通BST极端情况下退化成链表、查询效率暴跌的问题。核心特性有两点:1.满足二叉搜索树规则:左子树所有节点值<根节点值<右子树所有节点值,左右子树也遵循此规则;2.严格平衡约束:任意节点的左右子树高度差的绝对值不超过1,这个高度差被定义为平衡因子。AVL树的平衡因子只允许三个取值:-1、0、1。一旦超出这个范围,树就失去平衡,需要通过旋转操作调整。2.什么是平衡因子?如何计算?参考答案:平衡因子是用来判断二叉树节点是否平衡的核心指标,计算公式:当前节点左子树高度-右子树高度。取值说明:平衡因子=0:左右子树高度相等,节点完全平衡;平衡因子=1:左子树比右子树高,左偏;平衡因子=-1:右子树比左子树高,右偏;绝对值≥2:节点失衡,必须旋转修复。面试重点:AVL树所有节点必须实时维护平衡因子,插入、删除节点后需要回溯更新上层节点的高度和平衡因子,检查是否失衡。3.AVL树和普通二叉搜索树(BST)的区别?参考答案:核心区别在于平衡性和时间复杂度稳定性:1.普通BST:无平衡约束,最优情况是平衡二叉树,查找、插入、删除时间复杂度O(logn);但最坏情况(有序插入数据)会退化成单链表,时间复杂度O(n),效率极低。2.AVL树:强制严格平衡,树的高度始终稳定在logn级别,所有操作的最坏时间复杂度稳定O(logn),查询效率极高。代价:AVL树为了维持平衡,插入、删除大概率需要旋转调整,会产生少量性能开销,写操作比普通BST慢,但读操作效率更稳定。二、核心原理面试题(高频重点)4.AVL树有几种失衡情况?分别对应什么旋转方式?参考答案:AVL树一共四种失衡场景,对应四种旋转调整方式,所有失衡都出现在插入/删除节点后,从失衡节点向上回溯判定:(1)LL失衡(左左失衡)场景:失衡节点左子树过高,且左子树的左孩子过重(新节点插在左子树左侧)。调整方式:单次右旋转。(2)RR失衡(右右失衡)场景:失衡节点右子树过高,且右子树的右孩子过重(新节点插在右子树右侧)。调整方式:单次左旋转。(3)LR失衡(左右失衡)场景:失衡节点左子树过高,且左子树的右孩子过重(新节点插在左子树右侧)。调整方式:先左旋左子节点,再右旋失衡节点(双旋转)。(4)RL失衡(右左失衡)场景:失衡节点右子树过高,且右子树的左孩子过重(新节点插在右子树左侧)。调整方式:先右旋右子节点,再左旋失衡节点(双旋转)。5.详细说一下AVL树的左旋、右旋逻辑参考答案:右旋操作(解决LL失衡)以失衡节点A为旋转根,A的左孩子B作为新的根节点:1.将B的右子树,挂载为A的左子树;2.将A挂载为B的右子树;3.重新更新A、B两个节点的高度和平衡因子,完成平衡修复。左旋操作(解决RR失衡)以失衡节点A为旋转根,A的右孩子B作为新的根节点:1.将B的左子树,挂载为A的右子树;2.将A挂载为B的左子树;3.重新更新A、B两个节点的高度和平衡因子。核心要点:旋转操作不会破坏二叉搜索树的有序性,只调整树的结构,同时局部调整即可恢复整棵树的平衡。6.AVL树插入和删除的最大区别?(超级高频)参考答案:这是AVL树最核心的面试考点,两者最大差异在旋转次数和回溯范围:1.插入节点:最多只需要1次双旋转或单旋转即可恢复整棵树平衡。旋转完成后,上层节点的高度不会变化,无需继续向上回溯,平衡调整直接结束。2.删除节点:可能需要多次旋转。删除节点后,上层节点的高度大概率发生改变,会导致祖先节点连续失衡,需要从当前节点一直回溯到根节点,逐层检查、逐层调整,最坏情况下根节点都需要旋转。总结:插一次顶多一次转,删一次可能层层转。因此AVL树的删除操作开销远大于插入。三、代码手写面试题(实操必考)7.手写AVL树节点定义+获取树高度参考答案(Java标准版,面试通用):java

//AVL树节点定义

classAVLNode{

intval;

AVLNodeleft;

AVLNoderight;

intheight;//记录当前节点高度

publicAVLNode(intval){

this.val=val;

this.left=null;

this.right=null;

this.height=1;//新节点默认高度为1

}

}

//获取节点高度(空节点高度为0,避免空指针)

publicintgetHeight(AVLNodenode){

returnnode==null?0:node.height;

}

//计算平衡因子

publicintgetBalanceFactor(AVLNodenode){

returnnode==null?0:getHeight(node.left)-getHeight(node.right);

}

8.手写AVL树核心旋转方法(左旋、右旋)参考答案:java

//右旋操作

publicAVLNoderightRotate(AVLNodey){

AVLNodex=y.left;

AVLNodetemp=x.right;

//旋转核心步骤

x.right=y;

y.left=temp;

//更新高度(先更新子节点,再更新父节点)

y.height=Math.max(getHeight(y.left),getHeight(y.right))+1;

x.height=Math.max(getHeight(x.left),getHeight(x.right))+1;

//返回新的根节点

returnx;

}

//左旋操作

publicAVLNodeleftRotate(AVLNodey){

AVLNodex=y.right;

AVLNodetemp=x.left;

//旋转核心步骤

x.left=y;

y.right=temp;

//更新高度

y.height=Math.max(getHeight(y.left),getHeight(y.right))+1;

x.height=Math.max(getHeight(x.left),getHeight(x.right))+1;

returnx;

}

9.手写AVL树插入节点+平衡调整完整逻辑参考答案:java

publicAVLNodeinsert(AVLNoderoot,intval){

//1.普通二叉搜索树插入

if(root==null){

returnnewAVLNode(val);

}

if(val<root.val){

root.left=insert(root.left,val);

}elseif(val>root.val){

root.right=insert(root.right,val);

}else{

//重复节点不插入

returnroot;

}

//2.更新当前节点高度

root.height=Math.max(getHeight(root.left),getHeight(root.right))+1;

//3.获取平衡因子,判断是否失衡

intbalance=getBalanceFactor(root);

//LL失衡:右旋

if(balance>1&&val<root.left.val){

returnrightRotate(root);

}

//RR失衡:左旋

if(balance<-1&&val>root.right.val){

returnleftRotate(root);

}

//LR失衡:先左旋左子树,再右旋当前节点

if(balance>1&&val>root.left.val){

root.left=leftRotate(root.left);

returnrightRotate(root);

}

//RL失衡:先右旋右子树,再左旋当前节点

if(balance<-1&&val<root.right.val){

root.right=rightRotate(root.right);

returnleftRotate(root);

}

//未失衡,直接返回

returnroot;

}

四、进阶面试题(深挖原理、对比面试)10.AVL树和红黑树的区别?面试怎么选?参考答案(面试精简满分版):1.平衡力度不同:AVL是严格平衡(高度差≤1);红黑树是弱平衡(最长路径≤2倍最短路径)。2.旋转次数不同:AVL平衡要求高,读写操作旋转多、调整开销大;红黑树约束宽松,旋转次数极少,写操作效率更高。3.查询效率:AVL树更矮,查询速度略快;红黑树树高略高,查询稍慢但差距极小。4.使用场景:读多写少场景:优先用AVL树;写多读少、频繁增删场景:优先用红黑树(JavaTreeMap、HashMap底层均为红黑树)。11.AVL树的时间复杂度分析?参考答案:查找、插入、删除的最坏、平均时间复杂度均为O(logn)。原因:AVL树严格平衡,树的最大高度固定为1.44log(n+2)-1.328,始终维持对数级别高度,不会出现BST的最坏退化情况。所有操作的遍历层数固定为logn级,旋转调整为常数级操作,不影响时间复杂度。12.为什么实际工程中AVL树用得比红黑树少?参考答案:1.工程中大部分数据结构(有序映射、集合)都是频繁增删改查,红黑树的弱平衡特性大幅减少了旋转次数,写操作性能优势明显;2.AVL树严格平衡,每次增删都可能触发多层旋转,CPU开销更高,冗余调整过多;3.红黑树的规则简单、实现稳定性更强,且查询性能和AVL树差距微乎其微,完全可以覆盖绝大多数业务场景。仅在超高并发查询、极少修改的专用场景,会优先使用AVL树。五、易错陷阱面试题(面试官挖坑点)13.AVL树插入节点后,一定会旋转吗?参考答案:不一定。只有插入节点后,某一节点的平衡因子绝对值超过1,出现失衡时,才需要旋转调整。如果插入后整棵树所有节点高度差都在1以内,无需任何操作。大部分小规模插入场景不会触发旋转。14.AVL树可以存在重复节点

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论