解码AVL树

news/2025/10/2 14:55:58/文章来源:https://www.cnblogs.com/YouEmbedded/p/19123627

为什么要关注二叉树的平衡性?—— 从 BST 的缺陷说起

二叉搜索树(BST)的核心优势是 “高效搜索”:利用 “左子树所有节点值<根节点值<右子树所有节点值” 的特性,能从根节点开始快速定位目标节点。但 BST 有个致命缺陷 ——无法保证树的结构平衡,极端情况下会 “退化”,彻底丧失高效性。

BST 的退化现象

BST 的结构完全依赖节点插入顺序,若插入的节点值是 “有序的”(比如从小到大或从大到小),树会退化成一条 “链表”。

例子:有序插入导致 BST 退化

假设创建空 BST 后,依次插入节点值 1、2、3、4、5,最终树的结构如下:

image

这种结构虽然仍满足 BST 的定义(左小右大),但本质是单链表—— 每个节点只有右子树,没有左子树。

退化对性能的影响

BST 的性能取决于 “树的高度”:

  • 平衡的 BST:高度约为 log₂n(n 是节点总数),搜索时最多需要比较 log₂n 次,时间复杂度为 O(log₂n)。比如 n=1000 时,log₂1000≈10,只需比较 10 次。
  • 退化的 BST(链表):高度等于 n,搜索时需要从根遍历到最后一个节点,时间复杂度退化为 O(n)。比如 n=1000 时,最多需要比较 1000 次,效率大幅下降。

因此,我们需要一种 “自平衡的 BST”—— 既能保持 BST 的搜索特性,又能在插入 / 删除节点后自动调整结构,避免退化,这就是 “平衡树” 的核心需求。

平衡树的定义(量化 “平衡”)

要实现 “自平衡”,首先得明确:什么是 “平衡”?平衡树的严格定义:树中任意一个节点的左、右子树的高度差(称为 “平衡因子”)的绝对值 ≤ 1。

高度与平衡因子

  • 节点的高度:从该节点到 “最远叶子节点” 的路径上的节点总数(空树高度约定为 0,单个节点高度为 1)。
    • 例:空树高度 = 0;只有根节点时,根的高度 = 1;根有左子节点时,根的高度 = max (左子树高度,右子树高度)+1=max (1,0)+1=2。
  • 平衡因子:某节点的 “左子树高度 - 右子树高度”。平衡树要求所有节点的平衡因子 ∈ {-1, 0, 1}(绝对值≤1)。

例子:平衡树与非平衡树的对比

平衡树(所有节点平衡因子≤1)

image

非平衡树(存在节点平衡因子>1)

image

AVL 树 —— 严格自平衡的二叉搜索树

AVL 树是最早实现 “自平衡” 的 BST,由 Adelson-Velsky 和 Landis 提出,因此得名。AVL 树的核心定义:既是二叉搜索树(满足左小右大),又是平衡树(所有节点平衡因子∈{-1,0,1})。

AVL 树的关键能力是:插入或删除节点后,若树出现不平衡,能通过 “旋转” 操作快速恢复平衡,且旋转后仍保持 BST 的特性。

AVL 树不平衡的四种类型(插入 / 删除均可能导致)

插入或删除节点后,不平衡只会出现在 “从操作节点到根节点的路径上”,且不平衡的根源可归为四种类型,核心区别是 “不平衡节点的哪一侧子树过高,以及过高子树的哪一侧又过高”。

先明确两个概念:

  • 失衡节点:平衡因子绝对值>1 的节点(是不平衡的根源);
  • 高子树:失衡节点中高度更高的那一侧子树(左高或右高)。

四种不平衡类型如下:

类型 定义(以失衡节点为核心)
左左不平衡 失衡节点左子树过高(平衡因子>1),且左子树的左子树更高(左子树平衡因子≥0)
左右不平衡 失衡节点左子树过高(平衡因子>1),且左子树的右子树更高(左子树平衡因子<0)
右左不平衡 失衡节点右子树过高(平衡因子<-1),且右子树的左子树更高(右子树平衡因子>0)
右右不平衡 失衡节点右子树过高(平衡因子<-1),且右子树的右子树更高(右子树平衡因子≤0)

注:插入操作最多只会导致 1 个节点失衡;删除操作可能导致多个节点失衡,需从失衡节点向上回溯检查,直到根节点。

image

解决不平衡的核心操作 —— 旋转

旋转是 AVL 树恢复平衡的关键,本质是 “调整节点的父子关系”,分为基础旋转(左旋、右旋) 和复合旋转(左右旋、右左旋),每种不平衡类型对应一种旋转方案。

旋转的核心要求:

  • 旋转后必须恢复平衡(所有节点平衡因子≤1);
  • 旋转后必须保持 BST 特性(左小右大)。

基础旋转 1:右旋(处理 “左左不平衡”)

当失衡节点是 “左左不平衡” 时,用右旋将 “左子树提为新根”,降低左子树高度,恢复平衡。

image

image

基础旋转 2:左旋(处理 “右右不平衡”)

左旋是右旋的 “镜像操作”,用于处理 “右右不平衡”,核心是将 “右子树提为新根”,降低右子树高度。

复合旋转 1:左右旋(处理 “左右不平衡”)

“左右不平衡” 是 “左子树的右子树过高”,无法用单次右旋解决,需分两步:先对左子树做左旋,将其转为 “左左不平衡”,再对失衡节点做右旋。

复合旋转 2:右左旋(处理 “右左不平衡”)

右左旋是左右旋的 “镜像操作”,用于处理 “右子树的左子树过高”,步骤:先对右子树做右旋,转为 “右右不平衡”,再对失衡节点做左旋。

四种不平衡类型与旋转方案对应表

不平衡类型 解决步骤 核心逻辑
左左不平衡 对失衡节点直接右旋 左子树过高,提左子树为新根
左右不平衡 1. 对失衡节点的左子树左旋;2. 对失衡节点右旋 先将 “左右” 转为 “左左”,再右旋
右右不平衡 对失衡节点直接左旋 右子树过高,提右子树为新根
右左不平衡 1. 对失衡节点的右子树右旋;2. 对失衡节点左旋 先将 “右左” 转为 “右右”,再左旋

AVL 树的核心特性与应用场景

核心特性

  • 严格平衡:所有节点平衡因子∈{-1,0,1},树的高度严格控制在 O (log₂n);
  • 保持 BST 特性:旋转操作不会破坏 “左小右大”,因此搜索、插入、删除的逻辑都基于 BST;
  • 时间复杂度:搜索、插入、删除均为 O (log₂n),比普通 BST 更稳定;
  • 自调整:插入 / 删除后通过旋转自动恢复平衡,无需人工干预。

应用场景

AVL 树适合对 “查询效率要求极高” 且 “插入 / 删除频率不高” 的场景,比如:

  • 数据库索引(早期部分数据库用 AVL 树,后来更多用红黑树,因红黑树旋转次数更少);
  • 有序数据的快速查询(如字典、通讯录的按名查询)。

注:AVL 树的缺点是 “旋转次数多”—— 插入 / 删除可能需要多次旋转(尤其是删除),因此在插入 / 删除频繁的场景中,性能不如红黑树(红黑树是 “近似平衡”,旋转次数更少)。

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

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

相关文章

服务发现与注册中心设计:从Eureka到Nacos的CAP权衡——AP与CP的边界,藏在服务列表的一致性里 - 教程

服务发现与注册中心设计:从Eureka到Nacos的CAP权衡——AP与CP的边界,藏在服务列表的一致性里 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: blo…

LinuxWindows环境下Nacos3.1.0详细安装部署指南:从零到生产就绪

Linux&Windows环境下Nacos3.1.0详细安装部署指南:从零到生产就绪pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: &q…

商务网站创建流程是什么宿州哪家做网站不做

1月16号 MySQL 官方发布 8.3 创新版 和 8.0.36 长期支持版本 (该版本 没有新增功能,更多是修复bug ),本文基于 官方文档 说一下 8.3 版本带来的变化。 一 增加的特性 1.1 GTID_NEXT 支持增加 TAG 选项。 之前的版本中 GTID_NEXTUUID:number &#xff…

哪个网站有律师做的案件有没有资源免费的

应该是挺简单的代码, 记录一下分享. 首先最直接的想法就是使用循环, 用局部变量记录已选的checkbox, 达到最大值就将余下的checkbox都禁止选择, 例如以下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ""> <html xmlns"…

交通建设集团网站但无法选择(select)wordpress数据库.

文章目录 JAVA13概述语法层面特性switch表达式(预览)文本块(预览) API层次特性重新实现旧版套接字API 其他变化ZGC取消未使用的内存增加废弃和移除增加项移除项废弃项 JAVA13概述 2019年9月17日&#xff0c;国际知名的OpenJDK开源社区发布了Java编程语言环境的最新版本OpenJDK…

JAVA SE 基础语法 —— A / 初识 - 指南

JAVA SE 基础语法 —— A / 初识 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mo…

2025年掘进机厂家权威推荐榜:实力品牌与技术创新深度解析

2025年掘进机厂家权威推荐榜:实力品牌与技术创新深度解析在基础设施建设与矿山开采行业高速发展的今天,掘进机作为核心工程装备,其性能优劣直接关系到工程进度与施工安全。随着技术的不断革新,掘进机市场呈现出智能…

2025机械加工供货厂家权威口碑排行:实力与服务深度解析!

2025机械加工供货厂家权威口碑排行:实力与服务深度解析!行业背景在当今制造业蓬勃发展的大背景下,机械加工行业作为制造业的核心支柱之一,扮演着至关重要的角色。随着科技的不断进步和市场需求的日益多样化,机械加…

NOIP 集训日记 2.0

yuanshen,qidong!111

重庆网站seo搜索引擎优化常用的搜索引擎有哪些?

我们是否充分意识到云端所面临的网络安全威胁&#xff1f; 在当今互联互通的世界中&#xff0c;维护安全的环境至关重要。云的出现扩大了潜在威胁的范围&#xff0c;因为它催生了机器身份&#xff08;称为非人类身份 (NHI)&#xff09;及其秘密。随着组织越来越多地转向云原生…

2025舒适轮胎权威推荐榜:静音科技与驾乘体验口碑之选

2025舒适轮胎权威推荐榜:静音科技与驾乘体验口碑之选随着汽车工业的持续发展和消费者对驾乘体验要求的不断提升,舒适轮胎市场正迎来新一轮技术革新与产品升级。根据行业数据显示,2024年全球舒适轮胎市场规模已突破千…

2025七水硫酸锌厂家权威推荐榜:优质供应与专业定制首选

2025七水硫酸锌厂家权威推荐榜:优质供应与专业定制首选随着现代农业和工业的快速发展,七水硫酸锌作为重要的微量元素肥料和工业原料,其市场需求持续增长。在环保要求日益严格、产品质量标准不断提升的背景下,选择合…

深圳网站建设公司权威推荐榜:专业定制与创新设计口碑之选

深圳网站建设公司权威推荐榜:专业定制与创新设计口碑之选在数字化转型浪潮席卷各行各业的今天,企业网站已从简单的信息展示窗口升级为品牌形象展示、业务拓展和客户服务的重要平台。作为中国科技创新前沿阵地的深圳,…

UV面光源实力厂家权威推荐:专业制造与品质保障口碑之选

UV面光源实力厂家权威推荐:专业制造与品质保障口碑之选在精密制造、电子组装、医疗设备等高端工业领域,UV面光源作为关键固化设备,其性能优劣直接关系到产品质量和生产效率。随着产业升级和技术进步,市场对UV面光源…

郴州网站建设流程什么是工业互联网

在本文中&#xff0c;我们将介绍 10 多个最好的 IntelliJ IDEA 插件&#xff0c;以提高工作效率并在更短的时间内完成更多工作。如果将这些插件合并到您的工作流程中&#xff0c;您将能够更有效地应对开发挑战。 1、TabNine TabNine 是一个 IntelliJ IDEA 插件&#xff0c;可…

2025微弧氧化实力厂家推荐:专业表面处理技术深度解析

2025微弧氧化实力厂家推荐:专业表面处理技术深度解析在工业制造领域,表面处理技术一直是提升产品性能和使用寿命的关键环节。微弧氧化作为一种先进的表面处理技术,近年来在航空航天、汽车制造、电子设备等领域展现出…

网站建设类论文格式定制一款软件需要多少钱

背景 在flink基于事件的时间处理中&#xff0c;水位线记录的生成是一个很重要的环节&#xff0c;本文就来记录下几种水位线记录的生成方式的其中一种&#xff1a;周期性水位线生成器 周期性水位线生成器 1.1 BoundedOutOfOrdernessTimeStampExtractor 他会接收一个表示最大延…

实用指南:Ansible Playbook:自动化配置管理的利器

实用指南:Ansible Playbook:自动化配置管理的利器2025-10-02 14:33 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; disp…

灵芝产品网站建设方案旅行社的网站建设

归并思想 先拆分后合并 也就是分治&#xff1b; 拆分合并思想具体讲解可以参考以下链接&#xff1a; b站链接&#xff1a; 点这里&#xff1a;b站归并思想具体讲解 看代码 代码中的例子参考上图和下图 public class MergeSort {//一、拆分部分public static void split(i…

网站建设相对路径电话网站域名到期

前言 在授权码模式的前后端分离的那篇文章中使用了Redis来保存用户的认证信息&#xff0c;在Redis的配置文件中配置的值序列化器是默认的Jdk序列化器&#xff0c;虽然这样也可以使用&#xff0c;但是在Redis客户端中查看时是乱码的(看起来是)&#xff0c;如果切换为Jackson提供…