数据结构 -AVL树

news2024/10/7 7:24:50

文章目录

  • AVL树
      • 左旋和右旋
      • 插入的四种情况
        • (一)新数字插到了左子树,导致左子树比右子树高2;左孩子的左子树比其右子树高1
        • (二)新数字插到了左子树,导致左子树比右子树高2;左孩子的右子树比其左子树高1
        • (三)新数字插到了右子树,导致右子树比左子树高2;右孩子的右子树比其左子树高1
        • (四)新数字插到了右子树,导致右子树比左子树高2;右孩子的左子树比其右子树高1
      • 插入的代码
      • 例题

AVL树

AVL 树的意义:是二分查找树 BST 。二分查找树查找某个值时,时间复杂度是 O(h) ,因此,我们让树的尽可能平衡,即最大高度尽可能的小。因此有了 AVL 。

百度百科:在计算机科学中,AVL树是最先发明的自平衡二叉查找树。在AVL树中任何节点的两个子树的高度最大差别为1,所以它也被称为高度平衡树。增加和删除可能需要通过一次或多次树旋转来重新平衡这个树。AVL树得名于它的发明者G. M. Adelson-Velsky和E. M. Landis,他们在1962年的论文《An algorithm for the organization of information》中发表了它。

BST 本质上是维护一个有序序列,AVL 树中的左旋右旋操作,并不会改变树的中序遍历结果。

在这里插入图片描述

上图中把 A 右旋是怎么做的呢?把 B 旋转到根节点,然后把 A 变成 B 的右孩子,把 E 补偿给 A 作为 A 的左孩子。

左旋和右旋

在这里插入图片描述

对节点 u 右旋:

  • 根 u 的左儿子变成新的根 p
  • 根的左儿子变成新的根 p 原本的右儿子
  • 新的根 p 的右儿子变成了原本的根 u
  • u 和 p 的高度都需要更新
void R(int& u)
{
    int p = l[u];
    l[u] = r[p], r[p] = u;
    update(u), update(p);
    u = p;
}

对节点 u 左旋:

  • 根 u 的右儿子变成新的根 p
  • 根的右儿子变成新的根 p 原本的左儿子
  • 新的根 p 的左儿子变成了原本的根 u
  • u 和 p 的高度都需要更新
void L(int& u)
{
    int p = r[u];
    r[u] = l[p], l[p] = u;
    update(u), update(p);
    u = p;
}

高度更新由左右儿子决定,因为求高度时,默认其两个儿子已经更新完高度了:

void update(int u)
{
    h[u] = max(h[l[u]], h[r[u]]) + 1;
}

插入的四种情况

在这里插入图片描述

(一)新数字插到了左子树,导致左子树比右子树高2;左孩子的左子树比其右子树高1

对于四种情况中的①。应该右旋 A 。

在这里插入图片描述

实例如上图,右旋 88 即可。

(二)新数字插到了左子树,导致左子树比右子树高2;左孩子的右子树比其左子树高1

对于四种情况中的③。应该左旋 B 再右旋 A 。

在这里插入图片描述

对应的情况如如下:

  70
61
  65
// 左旋 61
    70
  65
61
// 右旋 70
  65
61  70
(三)新数字插到了右子树,导致右子树比左子树高2;右孩子的右子树比其左子树高1

对于四种情况中的②。应该左旋 A 。
在这里插入图片描述

对应的情况如 88 96 120 ,左旋 88 即可。

(四)新数字插到了右子树,导致右子树比左子树高2;右孩子的左子树比其右子树高1

对于四种情况中的④。应该右旋 B 再左旋 A 。

在这里插入图片描述

对应的情况如如下:

  70
96
  88
// 右旋 96
70
  88
    96
// 左旋 70
  96
70  88

插入的代码

void insert(int& u, int w)
{
    if (!u) u = ++ idx, v[u] = w;
    else if (w < v[u])
    {
        insert(l[u], w);
        if (get_balance(u) == 2)
        {
            if (get_balance(l[u]) == 1) R(u);
            else L(l[u]), R(u);
        }
    }
    else
    {
        insert(r[u], w);
        if (get_balance(u) == -2)
        {
            if (get_balance(r[u]) == -1) L(u);
            else R(r[u]), L(u);
        }
    }

    update(u);
}

如上,对于单一动作,总是旋转“发现者”;对于组合动作,先旋转“发现者”的子节点,再旋转“发现者”。

例题

  • AVL树的根 1066 Root of AVL Tree (25 point(s))
  • 判断完全 AVL 树 1123 Is It a Complete AVL Tree (30 point(s))

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

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

相关文章

Echarts中的热力图和漏斗图(在Vue中使用热力图和漏斗图)

热力图 (Heatmap) Echarts的热力图用于展示两个维度数据矩阵中的值分布情况。它通过在平面上划分成多个矩形区域&#xff0c;并用不同的颜色填充这些区域来表示数据的大小或强度。颜色渐变从浅到深通常映射着数值从小到大&#xff0c;从而直观展示数据的集中程度和分布模式。热…

MIPI概述

MIPI MIPI&#xff08;Mobile Industry Processor Interface&#xff09;是移动行业处理器接口的缩写&#xff0c;由移动行业处理器接口联盟&#xff08;MIPI Alliance&#xff09;&#xff08;一个标准化组织&#xff0c;官网&#xff1a;Interface Specifications for Mobil…

【web APIs】快速上手Day04(Dom节点)

目录 Web APIs - 第4天日期对象实例化方法案例-页面显示时间时间的另外一个写法 时间戳三种方式获取时间戳案例-毕业倒计时效果 节点操作DOM节点查找节点父节点查找案例-关闭广告子节点查找兄弟关系查找 增加节点创建节点追加节点案例-学成在线案例渲染克隆节点 删除节点 M端事…

IDEA 一键部署Docker

以部署示例服务&#xff08;sevnce-demo&#xff09;为例。 配置服务器 地址、账号、密码根据实际情况填写 配置镜像仓库 地址、账号、密码根据实际情况填写 编写Dockerfile 在sevnce-demo根目录下右键&#xff0c;选择创建Dockerfile。 # 基础镜像 FROM sevnce-registry.c…

如何为老化的汽车铅酸电池充电

一项小研究表明&#xff0c;汽车铅酸电池不同于深循环或固定电池。汽车电池旨在限度地提高启动电流容量&#xff0c;并且对深度放电或浮充(也称为第 3 阶段充电循环)反应不佳。起动电池的极板结构使表面积化&#xff0c;并且电解液比重 (SG) 高于其他电池&#xff0c;以提供高启…

14.优化算法之BFS解决FloodFill算法1

0.FloodFill简介 dfs&#xff1a;深度优先遍历&#xff08;红色&#xff09; bfs&#xff1a;宽度优先遍历 1.图像渲染 算法原理 class Solution {int[] dx { 0, 0, 1, -1 };int[] dy { 1, -1, 0, 0 };public int[][] floodFill(int[][] image, int sr, int sc, int color)…

小试牛刀-Solana合约账户详解

目录 一.Solana 三.账户详解 3.1 程序账户 3.2 系统所有账户 3.3 程序派生账户(PDA) 3.4 Token账户 四、相关学习文档 五、在线编辑器 Welcome to Code Blocks blog 本篇文章主要介绍了 [Solana合约账户详解] ❤博主广交技术好友&#xff0c;喜欢文章的可以关注一下❤ …

Ai的快速发展会是下一个风口嘛?

人工智能的快速发展确实是当前和未来科技领域的一个重要趋势&#xff0c;可以说是一个“风口”。以下是几个支持这一观点的理由&#xff1a; 1. **技术进步和应用广泛性**&#xff1a;人工智能技术在各个领域的应用越来越广泛&#xff0c;涵盖了医疗、金融、制造、交通、媒体等…

在TkinterGUI界面显示WIFI网络摄像头(ESP32s3)视频画面

本实验结合了之前写过的两篇文章Python调用摄像头&#xff0c;实时显示视频在Tkinter界面以及ESP32 S3搭载OV2640摄像头释放热点&#xff08;AP&#xff09;工作模式–Arduino程序&#xff0c;当然如果手头有其他可以获得网络摄像头的URL即用于访问摄像头视频流的网络地址&…

MySQL关于日志15个讲解

​​​​​​ 1. redo log是什么? 为什么需要redo log&#xff1f; redo log 是什么呢? redo log 是重做日志。 它记录了数据页上的改动。 它指事务中修改了的数据&#xff0c;将会备份存储。 发生数据库服务器宕机、或者脏页未写入磁盘&#xff0c;可以通过redo log恢复…

昇思25天学习打卡营第7天|深度学习流程全解析:从模型训练到评估

目录 构建数据集 定义神经网络模型 定义超参、损失函数和优化器 超参 损失函数 优化器 训练与评估 构建数据集 首先从数据集 Dataset加载代码&#xff0c;构建数据集。 代码如下&#xff1a; #引入了必要的库和模块&#xff0c;像 mindspore 以及相关的数据处理模块等等。…

初识Spark

一、简介 官网&#xff1a;Apache Spark™ - Unified Engine for large-scale data analytics Apache的顶级项目&#xff0c;用于大规模数据处理的统一分析引擎。 支持语言&#xff1a;Java、Scala、Python和R (源码为Scala) 高级工具&#xff1a; 1、SparkSQL用于SQL和结构…

IDEA开发必备的插件,实测非常好用

1、Lombok -- 简化Java代码开发 推荐指数&#xff1a; ★★★★★ Lombok&#xff1a;首当其冲的非常推荐的当然是Lombok Lombok能以简单的注解形式来简化Java代码&#xff0c;提高开发人员的开发效率。例如开发中经常需要写的JavaBean&#xff0c;都需要花时间去添加相应的ge…

如何在忘记密码的情况下删除华为ID激活锁

当您手中拥有最新的华为手机时&#xff0c;您会忍不住探索新的可能性&#xff0c;以从您的设备中获得最大价值。您可以下载新的应用程序、Android 启动器等&#xff0c;但这些应用程序中的大多数都会给您的手机带来错误和安全威胁&#xff0c;如果不恢复出厂设置&#xff0c;可…

对标 GPT-4o 的开源实时语音多模态模型:Moshi

是由法国的 AI 实验室 Kyutai 推出的实时语音多模态模型&#xff0c;支持听、说、看&#xff0c;最关键的是你现在就可以在浏览器中使用&#xff0c;如果这个链接延迟高&#xff0c;可以试试这个, 无需输入邮箱&#xff0c;点击 Join queue 即可。 简单体验了下&#xff0c;比…

自学新标日第十七课(已完结)

第十七课 单词 单词假名声调词义洋服ようふく0西服セーター&#xff11;毛衣ノートバソコン&#xff14;笔记本电脑バイク1摩托车お汁粉おしるこ2年糕小豆汤天ぷらてんぷら&#xff10;天麩羅初詣はつもうで&#xff13;新年后首次参拜健康けんこう0健康恋愛れんあい0恋爱相手…

springboot 整合 mybatis-plus

一.前言 1. mybatis-plus是什么 mybatis-plus是一个对mybati框架的拓展框架&#xff0c;它在mybatis框架基础上做了许多的增强&#xff0c;帮助我们快速的进行代码开发。目前企业开发中&#xff0c;使用mybati的项目基本会选择使用mybatis-plus来提升开发效率。 2.官网地址&…

机器学习:预测评估8类指标

机器学习&#xff1a;8类预测评估指标 R方值、平均值绝对误差值MAE、均方误差MSE、均方误差根EMSE、中位数绝对误差MAD、平均绝对百分误差MAPE、可解释方差分EVS、均方根对数误差MLSE。 一、R方值 1、说明&#xff1a; R方值&#xff0c;也称为确定系数或拟合优度&#xff…

3099.力扣每日一题7/3 Java(击败100%)

博客主页&#xff1a;音符犹如代码系列专栏&#xff1a;算法练习关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 目录 思路 解题方法 时间复杂度 空间复杂度 Code 思路 首先要解决如何…

MobileVitv1替换yolov8主干网络

一、原理介绍 MobileViT模型是为移动设备设计的轻量级、通用目的视觉变换器。它融合了卷积神经网络&#xff08;CNN&#xff09;和视觉变换器&#xff08;ViT&#xff09;的优势&#xff0c;旨在在保持高效性能的同时减少模型参数和降低延迟。以下是关于MobileViT模型的主要原理…