大白话聊AVL树

news2024/11/17 6:20:48

文章目录

  • 前言
  • AVL树的平衡性
  • 不平衡的几种情况
  • AVL树恢复平衡
    • LL恢复平衡
    • RR恢复平衡
    • LR恢复平衡
    • RL恢复平衡
  • 总结

前言

上文对常见的数据结构进行了简单介绍,包括它们的定义、性质和特点。本文将对AVL树展开介绍,通过对AVL树的插入、删除、查找以及旋转操作全面掌握AVL树。

AVL树的平衡性

通过上文可以知道AVL树通过旋转操作解决二叉查找树可能成为线性结构的问题,也简单描述了左旋、右旋操作可以保持树的平衡。那么就有个问题:AVL树什么情况下进行左旋、右旋操作?

总的来说,当破坏树的平衡后需要左旋、右旋操作。什么时候会破坏?AVL树平衡性取决于左右子树高度差,也就是当插入或删除节点导致某个节点的左右子树高度差大于1时视为破坏树的平衡性,此时需要左旋、右旋操作来保持平衡。

不平衡的几种情况

因为出现不平衡会有好几种情况,所以每个情况的旋转操作都是不一样的,下图为不平衡的几种情况。

在这里插入图片描述

  • LL:以上图为例,节点9的左子树高度为2且左子树也只有左子树,而右子树高度为0,两者高度差为2,大于1,破坏了树的平衡,这种情况称为LL。节点9需要进行一次右旋操作。

  • LR:以上图为例,节点10的左子树高度为2且左子树只有右子树,而右子树高度为0,两者高度差为2,大于1,破坏了树的平衡,这种情况称为LR。节点8需要先进行一次左旋操作后节点10再进行一次右旋操作。

  • RR:以上图为例,节点9的右子树高度为2且右子树也只有右子树,而左子树高度为0,两者高度差为2,大于1,破坏了树的平衡,这种情况称为RR。节点9需要进行一次左旋操作。

  • RL:以上图为例,节点8的右子树高度为2且右子树只有左子树,而右子树高度为0,两者高度差为2,大于1,破坏了树的平衡,这种情况称为RL。节点10需要先进行一次右旋操作后节点8再进行一次左旋操作。

AVL树恢复平衡

接下来演示这几种情况如何通过旋转操作恢复平衡的。

先复习一下:

右旋操作:以某个节点为旋转点,其左子节点变为其父节点,左子节点的右子节点变为其左子节点,右子节点不变。
左旋操作:以某个节点为旋转点,其右子节点变为其父节点,右子节点的左子节点变为其右子节点,左子节点不变。

LL恢复平衡

LL恢复平衡:一次右旋操作。

在这里插入图片描述

如上图,当插入节点6时,会向上更新节点的高度,当到达节点8时会发现其左子树高度为2,右子树为0,高度差为2,此时以节点8为旋转点向右旋转一次:节点7变为节点8的父节点,节点7的右子节点变为节点8的左子节点,节点8右子节点不变。示例代码如下:

private Node rotateRight(Node node) {
	//节点7将作为父节点
    Node newRoot = node.left;  
    //先将节点7的右子节点变为节点8的左子节点,这里因为没有,所以为null
    node.left = newRoot.right;  
    //节点7变为节点8的父节点,因为是右旋,所以成为新父节点的右子节点
    newRoot.right = node;  
    //更新节点高度
    node.height = Math.max(getHeight(node.left), getHeight(node.right)) + 1;  
    newRoot.height = Math.max(getHeight(newRoot.left), getHeight(newRoot.right)) + 1;  
    return newRoot;  
}  

RR恢复平衡

RR恢复平衡同LL。

LR恢复平衡

LR恢复平衡:一次左旋操作之后再一次右旋操作。

在这里插入图片描述

如上图,当插入节点6时,会向上更新节点的高度,当到达节点7时会发现其左子树高度为2,右子树为0,高度差为2,此时以节点5为旋转点向左旋转一次:节点6变为节点5的父节点,之后再以节点7为旋转点向右旋转一次,同上LL恢复平衡。示例代码如下:

private Node rotateRightAndLeft(Node node) {
	//节点5左旋
	node=rotateLeft(node.left);
	//节点7右旋
	node=rotateRight(node);
	return node;
}  


private Node rotateLeft(Node node) {
	//节点6将作为父节点
    Node newRoot = node.right;
    //先将节点5的右子节点变为节点6的左子节点,这里因为没有,所以指向null
    node.right = newRoot.left;  
    //节点6变为节点5的父节点,因为是左旋,所以成为新父节点的左子节点
    newRoot.left = node;  
    node.height = Math.max(getHeight(node.left), getHeight(node.right)) + 1;  
    newRoot.height = Math.max(getHeight(newRoot.left), getHeight(newRoot.right)) + 1;  
    return newRoot;  
}  

RL恢复平衡

RL恢复平衡同LR。

总结

  1. AVL是一棵自平衡的查找二叉树。
  2. AVL的平衡性取决于某个节点的左右子树高度差是否大于1。
  3. 当插入或删除节点时可能会导致树的不平衡。
  4. 有4种不平衡的情况:LL、RR、LR、RL。
  5. 当出现不平衡的情况需要通过旋转节点保持平衡。
    • LL:向右旋转一次。
    • RR:向左旋转一次。
    • LR:左子节点先左旋转一次,自己再向右旋转一次。
    • RL:右子节点先右旋转一次,自己再向左旋转一次。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1115891.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CleanMyMac X4.14.4最新免费版本功能介绍

最新版CleanMyMac X 让您的Mac焕然一新,时刻保持安全!CleanMyMac X是一款专业的Mac清理软件,可智能清理mac磁盘垃圾和多余语言安装包,快速释放电脑内存,轻松管理和升级Mac上的应用。同时CleanMyMac X可以强力卸载恶意软…

力扣第332题 重新安排行程 c++ 难

题目 332. 重新安排行程 困难 相关标签 深度优先搜索 图 欧回路 给你一份航线列表 tickets ,其中 tickets[i] [fromi, toi] 表示飞机出发和降落的机场地点。请你对该行程进行重新规划排序。 所有这些机票都属于一个从 JFK(肯尼迪国际机…

通达信神奇九转指标原理及选股公式,无未来函数,数字不消失

神奇九转指标的原理源自技术分析师汤姆迪马克(Tom Demark)发明的TD序列,用于识别趋势衰竭和价格反转的时间。神奇九转指标是一种震荡指标,目的在于解决一些技术分析指标在趋势行情中有利可图,但在震荡行情中表现很差的问题。 一、神奇九转指标…

算法通关村第19关【白银】| 动态规划高频问题

1.零钱兑换 思路: 确定dp:这里是最少硬币的个数,不是种类 确定递推公式:dp[j] Math.min(dp[j],dp[j-coins[i]]1),不要当前硬币dp[j]还是保持以前的组合方法,要当前硬币dp[j-coins[i]]1 确定初始化:dp[0]0,其他的都…

NFT Insider112:The Sandbox聘请Apple高管担任其首席内容官,YGG 将在菲律宾举办Web3游戏峰会

引言:NFT Insider由NFT收藏组织WHALE Members、BeepCrypto联合出品,浓缩每周NFT新闻,为大家带来关于NFT最全面、最新鲜、最有价值的讯息。每期周报将从NFT市场数据,艺术新闻类,游戏新闻类,虚拟世界类&#…

华为eNSP配置专题-浮动路由及BFD的配置

文章目录 华为eNSP配置专题-浮动路由及BFD的配置0、参考文档1、前置环境1.1、宿主机1.2、eNSP模拟器 2、基本环境搭建2.1、基本终端构成和连接2.2、基本终端配置 3、浮动路由配置3.1、浮动路由的基本配置3.2、浮动路由的负载均衡问题3.3、浮动路由的优先级调整 4、BFD的配置4.1…

YOLOv8改进实战 | 更换主干网络Backbone(四)之轻量化模型MobileNetV3

前言 轻量化网络设计是一种针对移动设备等资源受限环境的深度学习模型设计方法。下面是一些常见的轻量化网络设计方法: 网络剪枝:移除神经网络中冗余的连接和参数,以达到模型压缩和加速的目的。分组卷积:将卷积操作分解为若干个较小的卷积操作,并将它们分别作用于输入的不…

利用 Pytest Cache Fixture 实现测试结果缓存

前言 接口自动关过程中,经常会遇到这样一些场景,"请求2需要用到请求1响应的数据",常见的做法,进行用例依赖或者将请求1的响应结果写入一个文件,用到的时候读取文件。当然这都不是这篇文章的重点&#xff0c…

Redis性能滑坡:哈希表碰撞的不速之客【redis第二部分】

Redis性能滑坡:哈希表碰撞的不速之客 前言第一部分:Redis哈希表简介第二部分:哈希表冲突原因第三部分:Redis哈希函数第四部分:哈希表冲突的性能影响第五部分:解决冲突策略第六部分:redis是如何解…

nginx常见报错及解决acme.sh给Nginx配置SSL证书

问题排查: nginx -t //检查配置是否正确只要返回ok就说明配置没问题。 Nginx报错Failed to restart nginx.service: Unit not found 解决方法: 1、在根目录下执行 vim /etc/init.d/nginx2、插入以下代码 #!/bin/sh # nginx - this script starts …

Python rich库

1. 安装 pip install rich Collecting richDownloading rich-13.6.0-py3-none-any.whl.metadata (18 kB) Collecting markdown-it-py>2.2.0 (from rich)Downloading markdown_it_py-3.0.0-py3-none-any.whl.metadata (6.9 kB) Collecting pygments<3.0.0,>2.13.0 (f…

1024程序员节,给大家送份福利

各位“爱码士”们 一年一度的1024程序员节就要到了 提前祝程序猿/媛们节日快乐 除了祝福&#xff0c;肯定少不了福利啦&#xff5e; 废话不多说&#xff0c;直接上福利 知了堂1024加油包 用心成就你的IT梦想 价值9800的程序员助梦加油包 仅需1.24元 内含1024元助学金 …

Sui成为DeFi增长的首选平台

Sui网络在过去的三个月内DeFi活动增长迅速&#xff0c;其中TVL增长了341&#xff05;&#xff0c;交易量增长了229&#xff05;。这一增长对于Sui来说是一个重要的里程碑&#xff0c;它展示了Sui为其DeFi生态中的第三方开发者提供的实用性&#xff0c;以及他们支持数百万用户进…

element-ui 以CDN 方式引入原生js开发的几个别坑 (+vue)

element-ui 以CDN 方式引入原生js开发的几个坑 最近两个月太忙了 忙的没空写文章 两个月赶出来了几个的项目 一个是雪佛兰裸眼3D的一个商品屏幕展示项目 一个是广汽云渲染的一个云看车项目 一个是奥迪中国充电桩的网页开发项目&#xff0c; 奥迪中国做个饭也是目前正在做的 不…

Linux系统编程04

进程的概念 进程&#xff08;动态&#xff09;是一个正在运行的程序&#xff08;静态&#xff09; 多道程序设计缺点&#xff1a; &#xff08;1&#xff09;缺乏隔离&#xff0c;各个程序之间可以直接访问&#xff0c;使用对方的数据 &#xff08;2&#xff09;内存使用率低&a…

正点原子嵌入式linux驱动开发——LED驱动开发

在上一篇笔记中&#xff0c;详细的讲解了字符设备驱动开发步骤&#xff0c;并且用一个虚拟的chrdevbase设备为例完成了第一个字符设备驱动的开发。本章就开始编写第一个真正的Linux字符设备驱动。在正点原子STM32MP157开发板上有一个LED灯&#xff0c;本章就学习一下如何编写Li…

探讨Unity新的收费模式:对开发者与游戏行业的影响、负面因素的解析及面对挑战的建议

本人详解 作者&#xff1a;王文峰&#xff0c;参加过 CSDN 2020年度博客之星&#xff0c;《Java王大师王天师》采购供应链共享平台人员,财务规则对账人员&#xff0c;物流门禁计量系统对接人员&#xff0c;ERP事业部人员 Unity是一款备受开发者欢迎的跨平台游戏引擎&#xff0c…

基于SSM的台球厅管理系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

【再识C进阶5(上)】详细介绍C语言文件操作——文件是用于存储数据

前言 &#x1f493;作者简介&#xff1a; 加油&#xff0c;旭杏&#xff0c;目前大二&#xff0c;正在学习C&#xff0c;数据结构等&#x1f440; &#x1f493;作者主页&#xff1a;加油&#xff0c;旭杏的主页&#x1f440; ⏩本文收录在&#xff1a;再识C进阶的专栏&#x1…

成绩查询页面和自助查询方式

科技发展让我们有更多的方式来发布和查询学生成绩。今天&#xff0c;我想向大家介绍什么是成绩查询页面&#xff0c;并分享如何通过各种代码和Excel来实现让学生自助查询成绩。 成绩查询页面是一个专门用来发布和查询学生成绩的网络页面。这个页面具有发布、查询、统计成绩等功…