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

下载本文档

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

文档简介

AVL树面试真题及详细答案(实战版)一、基础概念面试题(入门必问)1.什么是AVL树?核心特性是什么?参考答案:AVL树是自平衡二叉搜索树,是最早的平衡二叉树结构。它在二叉搜索树的基础上,增加了严格的平衡约束,解决了普通二叉搜索树在极端场景下退化成链表、查询效率暴跌的问题。核心特性有两点:1.满足二叉搜索树规则:左子树所有节点值<根节点值<右子树所有节点值,左右子树也遵循该规则;2.满足平衡规则:任意节点的左右子树高度差(平衡因子)绝对值不超过1。正是这个严格的平衡规则,让AVL树的查询、插入、删除操作时间复杂度稳定在O(logn)。2.什么是平衡因子?AVL树平衡因子的取值范围?参考答案:平衡因子的定义:当前节点左子树高度-右子树高度。AVL树要求所有节点的平衡因子只能是-1、0、1三个值:-平衡因子=0:左右子树高度相等,节点完全平衡;-平衡因子=1:左子树比右子树高1,左偏平衡;-平衡因子=-1:右子树比左子树高1,右偏平衡;一旦某个节点平衡因子超出这个范围(2或-2),说明树失衡,必须通过旋转操作修复平衡。3.AVL树和普通二叉搜索树(BST)的区别?参考答案:1.平衡性不同:普通BST无平衡约束,极端情况下(有序插入数据)会退化成单链表,时间复杂度最坏O(n);AVL树强制平衡,高度始终维持在logn级别,复杂度稳定O(logn);2.操作开销不同:普通BST仅需简单的增删查;AVL树增删后需要计算平衡因子、判断失衡、执行旋转,插入删除开销更大;3.适用场景不同:BST适合数据随机、无需频繁修改的场景;AVL树适合查询多、增删少的场景,靠稳定的平衡结构保证查询效率。二、核心原理面试题(高频重点)1.AVL树为什么需要旋转?有几种旋转方式?分别解决什么问题?参考答案:AVL树插入或删除节点后,局部子树高度会发生变化,导致节点平衡因子超标、树失衡,旋转是唯一的平衡修复手段,不会破坏二叉搜索树的有序性,同时能修正高度差。一共四种旋转场景,本质是两种基础旋转的组合:(1)LL右旋(单旋)场景:节点左子树的左孩子插入节点导致失衡(左左失衡)。操作:以失衡节点的左孩子为中心,整体右旋,将左孩子上位为根,原根节点下沉为右子节点,左孩子的原有右子树挂靠到原根的左子树。(2)RR左旋(单旋)场景:节点右子树的右孩子插入节点导致失衡(右右失衡)。操作:以失衡节点的右孩子为中心,整体左旋,将右孩子上位为根,原根节点下沉为左子节点,右孩子的原有左子树挂靠到原根的右子树。(3)LR左右双旋场景:节点左子树的右孩子插入节点导致失衡(左右失衡),单旋无法修复。操作:先对左子树做一次左旋,转化为LL失衡场景,再对失衡节点做一次右旋,完成平衡修复。(4)RL右左双旋场景:节点右子树的左孩子插入节点导致失衡(右左失衡),单旋无法修复。操作:先对右子树做一次右旋,转化为RR失衡场景,再对失衡节点做一次左旋,完成平衡修复。2.AVL树插入和删除的最大旋转次数?为什么不一样?参考答案:1.插入节点:最多2次旋转插入只会导致一条路径上的节点失衡,且修复平衡后,整棵树的高度和上层节点的平衡状态都会恢复正常,不会产生连锁失衡,最多一次双旋(2次单旋)即可修复。2.删除节点:最多O(logn)次旋转删除节点可能会改变子树高度,修复当前节点平衡后,会导致上层祖先节点连锁失衡,需要从当前节点一路向上回溯根节点,逐层判断、逐层旋转,最坏情况需要遍历整棵树的高度,也就是logn次旋转。这也是AVL树删除效率偏低的核心原因。3.AVL树的高度上限是多少?参考答案:设n为节点总数,AVL树的最大高度h满足:h≤1.44log₂(n+2)-1。对比普通BST最坏高度h=n,AVL树高度被严格约束,这也是它查询效率稳定的核心原因。日常面试中无需死记公式,记住核心结论即可:AVL树高度始终为对数级别。三、对比进阶面试题(手撕对比高频)1.AVL树和红树的区别?各自适用场景?(必问压轴题)参考答案:1.平衡严格程度不同AVL树平衡极严格:左右子树高度差≤1;红黑树平衡宽松:通过颜色规则约束,最长路径不超过最短路径的2倍,属于弱平衡。2.旋转开销不同AVL树平衡要求高,失衡概率大,增删旋转次数更多,删除可能连锁旋转;红黑树规则宽松,调整次数极少,最多2次旋转,开销远低于AVL树。3.查询效率不同AVL树树高更低、结构更紧凑,查询速度更快;红黑树树高略高,查询效率稍弱。4.适用场景AVL树:查多改少(如静态数据索引、高频查询、低频更新场景);红黑树:改多查多(如JavaTreeMap、HashMap底层,频繁增删改场景)。2.为什么Java集合框架不用AVL树,而用红黑树?参考答案:Java的TreeMap、TreeSet、HashMap红黑树化场景,都是频繁增删改的动态数据场景。AVL树虽然查询快,但增删的旋转开销太大,尤其是删除操作的连锁旋转,会严重损耗性能;而红黑树牺牲了极致的平衡度,大幅降低了调整开销,整体读写综合性能更优,更适配业务高频修改的场景。只有在几乎不修改、只做查询的场景,AVL树才有优势。四、代码手写面试题(笔试/机试必考)1.手写AVL树节点定义+获取树高度方法参考答案(Java版,面试标准写法):java

//AVL树节点定义

classAVLNode{

intval;

AVLNodeleft;

AVLNoderight;

intheight;//记录当前节点为根的子树高度

publicAVLNode(intval){

this.val=val;

this.left=null;

this.right=null;

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

}

}

//AVL树核心工具方法

publicclassAVLTree{

//获取节点高度(空节点高度为0)

publicintgetHeight(AVLNodenode){

returnnode==null?0:node.height;

}

//计算节点平衡因子

publicintgetBalanceFactor(AVLNodenode){

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

}

}2.手写AVL树四种旋转核心代码参考答案(面试精简可直接默写版):java

//右旋(解决LL失衡)

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;

}

//左旋(解决RR失衡)

publicAVLNodeleftRotate(AVLNodex){

AVLNodey=x.right;

AVLNodetemp=y.left;

//左旋核心操作

y.left=x;

x.right=temp;

//更新高度

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

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

returny;

}

//插入后平衡修复方法(整合四种场景)

publicAVLNodebalance(AVLNodenode){

intbalance=getBalanceFactor(node);

//LL左左失衡:右旋

if(balance>1&&getBalanceFactor(node.left)>=0){

returnrightRotate(node);

}

//RR右右失衡:左旋

if(balance<-1&&getBalanceFactor(node.right)<=0){

returnleftRotate(node);

}

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

if(balance>1&&getBalanceFactor(node.left)<0){

node.left=leftRotate(node.left);

returnrightRotate(node);

}

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

if(balance<-1&&getBalanceFactor(node.right)>0){

node.right=rightRotate(node.right);

returnleftRotate(node);

}

//无失衡,直接返回

returnnode;

}五、易错问答面试题(面试官深挖点)1.AVL树插入节点后,一定会旋转吗?参考答案:不一定。只有插入节点后,某条祖先路径上出现平衡因子超标(±2)时,才需要旋转修复。如果插入后所有节点平衡因子仍在-1、0、1范围内,树保持平衡,无需任何旋转操作。大部分普通插入场景都不需要旋转。2.AVL树删除节点后,一定需要回溯更

温馨提示

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

最新文档

评论

0/150

提交评论