数据结构和算法之树形结构(3)

news2024/9/27 15:48:48

文章出处:数据结构和算法之树形结构(3)

关注码农爱刷题,看更多技术文章!!

四、平衡二叉树(接前篇)

      上一章节讲到为了避免二叉查找树退化成链表后的极度不平衡带来的低效率而衍生出了平衡二叉树,平衡二叉树的严格定义是这样的:二叉树中任意一个节点的左右子树的高度相差不能大于 1。这样的定义就是尽可能保证二叉树左右节点的平衡,从而保证时间复杂度的高效。从平衡二叉树的定义不难看出,不仅满二叉树,还有完全二叉树(关于两者的定义,可以查看前述文章 数据结构和算法之线性结构)都是符合平衡二叉树定义的,而其他的非完全二叉树也可能是平衡二叉树,例如下图就是一棵非完全二叉树,但它是平衡二叉树。

图片

     了解平衡二叉树基本定义后,我们再看平衡二叉查找树,所谓平衡二叉查找树就是不仅要满足平衡二叉树的定义,还需要满足二叉查找树的规范即按大小排序。常见的平衡二叉查找树有AVL树红黑,本章先介绍AVL树。

五、AVL树

     AVL树是最早设计出来的一种平衡二叉查找树,它通过在插入和删除节点时进行旋转操作来保持内部树的平衡,即任何节点的左右子树高度相差不超过1,是一种严格的自平衡二叉树。这种即时的高度自平衡机制是AVL树最大的特点,也使得其在执行查找、插入和删除操作时的效率非常高,其时间复杂度保持在O(log n)。

     AVL树自平衡机制

     要了解AVL树的自平衡机制,我们要先了解一些基本概念:

平衡因子:即AVL树每个节点都有一个平衡因子,定义为其左子树的高度减去右子树的高度;平衡因子的值只能是-1、0或1。

     通俗的说,平衡因子就是AVL树节点的左右子树高度的差的负值,如果左子树比右子树高一层,那么平衡因子就为-1;如果左右子树一样高,平衡因子就为0;如果右子树比左子树高一层,那么平衡因子就为1,这三种情况下AVL树的性质都没有被打破。按照这个规则,如果平衡因子为-1到1以外的其他值,则说明左右子树已经失衡,AVL树性质被打破,AVL树则不再是一棵AVL树。而对AVL树进行增删节点,就会破坏这种平衡即失衡,所以AVL树引进了一种机制,在增删节点后,通过节点自旋来恢复被破坏的平衡性,这种机制即AVL树的自平衡机制。所谓节点自旋,就是在不改变AVL树节点大小顺序的情况下调整树的结构使之重新平衡(这个平衡本质上就是其左右子树高度的平衡)。

      对于AVL树失衡的四种场景和对应的旋转方式总结如下表:

图片

      LL场景-右旋

     下面我们以LL场景为例,对AVL树失衡和通过旋转实现自平衡的过程进行说明。所谓LL失衡,即节点左子树高度大于右子树高度且高差大于1,并且其左子节点的左子树也高于或等于右子树的高度但差在平衡因子值正常范围内,如下图:

图片

      图中根节点8左子树高度-右子树高度 = 2,即失衡;而其左子节点6左子树高度也高于右子树高度但高度差为1。调整的旋转方法则向相反方向旋转,即右旋,具体步骤如下:

1.  右旋失衡根节点8使其成为其左节点6的右节点;2.  同时使原左节点6的右孩子7成为原根节点8的左节点

       旋转后的图如下,旋转后,恢复了AVL树的平衡特性:

图片

   左旋过程类似,右旋和左旋实现代码如下:


private AVLNode rightRotate(AVLNode red) {
    AVLNode yellow = red.left;
    AVLNode green = yellow.right;
    yellow.right = red;
    red.left = green;
    return yellow;
}

private AVLNode leftRotate(AVLNode red) {
    AVLNode yellow = red.right;
    AVLNode green = yellow.left;
    yellow.left = red;
    red.right = green;
    return yellow;
}
     LR场景-左右旋

    下面我们再用稍微复杂的RL场景为例,对AVL树失衡和通过旋转实现自平衡的过程进行进一步说明。所谓LR失衡,即失衡节点左子树高度大于右子树高度且高差大于1,并且失衡节点左子节点的右孙子树高于左孙子树的高度但差在平衡因子值正常范围内,如下图:

图片

     图中根节点6左子树高度-右子树高度 = 2,即失衡;而其左子节点6的右孙子树高于左孙子树且高度差为1。调整的旋转方法则采用右旋,具体步骤如下:

1. 先左旋左节点2,使其右孩子4成为其父节点;   同时右孩子4成为根节点6的左节点,操作完后如下图:

图片

2. 再右旋根节点6,使其成为左节点4的右节点;   同时,左节点4成为新的根节点,而节点5则成为原根节点6的左节点

    左右旋转都完成后图如下:

图片

    其实,LR场景就是RR场景和LL场景的组合,第一步左旋后,LR场景就从RR场景转变为了LL场景,所以后续的处理也对应LL场景处理方法右旋即可,这点从代码实现上也可以看出:


private AVLNode leftRightRotate(AVLNode root) {
    root.left = leftRotate(root.left); // 先左旋左节点,对应RR
    return rightRotate(root); // 再右旋根节点 对应LL
}

private AVLNode rightLeftRotate(AVLNode root) {
    root.right = rightRotate(root.right);
    return leftRotate(root);
}

     RL场景的右左旋,逻辑则刚好相反,大家可自行去研究,AVL树的自平衡机制和相关知识就介绍到此(其节点增删查找同二叉查找树一致,此处也不再重复介绍,可参看前述文章)。正由于AVL树的自平衡机制,使AVL树能持续保持平衡二叉树的特性,从而能保证其时间复杂度一直接近O(logN),且处理旋转的时间复杂度为O(1),因而整体上会比非平衡二叉查找树有更好的效率。

      但是成也萧何、败也萧何,AVL树的优点在某些场景下也会变成缺点,例如在大规模节点频繁插入和删除的场景下,实现自平衡机制的旋转操作就会成为负担,所以,红黑树应运而生。红黑树相关知识,请关注后续章节。

码农爱刷题

为计算机编程爱好者和从业人士提供技术总结和分享 !为前行者蓄力,为后来者探路!

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

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

相关文章

CDGA|数据治理:策略与价值的深度融合

在当今这个数据驱动的时代,企业数据治理的重要性日益凸显。数据不仅是企业的核心资产,更是驱动业务决策、优化运营流程、创新产品服务的关键力量。然而,要让数据治理真正发挥价值,企业需要采取一系列策略来确保数据的准确性、完整…

Unity 资源 之 PoseAI 基于肌肉的姿势创作工具

Unity 资源 之 PoseAI 基于肌肉的姿势创作工具 一,前言二,资源包内容三,免费获取资源包 一,前言 Unity 开发者们,今天要为大家介绍一款极具创新性的工具 ——PoseAI。 PoseAI 是一种最先进的基于肌肉的姿势创作工具&…

Flink基本概念和算子使用

基础概念 Flink是一个框架和分布式处理引擎,用于对无界数据流和有界数据流进行有状态计算,它的核心目标是“数据流上的有状态计算”。 有界流和无界流 有界流:具有明确的开始和结束时间,数据量有限。适合使用批处理技术&#xf…

Elasticsearch实战宝典:从日志分析到实时数据监控,全方位解锁搜索与分析的无限可能!

Elasticsearch 是一个开源的分布式搜索和分析引擎,常用于处理大规模数据。它提供了强大的全文搜索、结构化搜索、实时统计分析等功能。以下是一些 Elasticsearch 的实战应用案例。 1. 日志分析系统 Elasticsearch 经常被用于集中式日志管理(Centralized…

使用SSE流式输出(Javaweb前后端实战)

目录 一.什么是SSE? 主要特点: 二.SSE的实现过程: 三.SSE的前端实现: 1.创建 EventSource 对象: 2.处理接收到的信息: 3.处理特定事件: 4.处理连接错误问题: 5.关闭连接&am…

网络安全的方方面面

目录 一、网络安全概述二、数据加密三、消息完整性与数字签名四、身份认证五、密钥分发中心(KDC)与证书认证(CA)六、防火墙与入侵检测系统七、网络安全协议八、网络安全攻防 -- 黑客攻击简要流程九、网络安全常用术语 一、网络安全概述 网络安全的基本特征:相对性、…

ArcGIS Desktop使用入门(三)常用工具条——拓扑(上篇:地图拓扑)

系列文章目录 ArcGIS Desktop使用入门(一)软件初认识 ArcGIS Desktop使用入门(二)常用工具条——标准工具 ArcGIS Desktop使用入门(二)常用工具条——编辑器 ArcGIS Desktop使用入门(二&#x…

基于Java的学生档案管理系统

基于springbootvue实现的学生档案管理系统 (源码L文ppt)4-065 第4章 系统设计 4.1 总体功能设计 学生档案管理系统的总体功能设计包括学生信息管理、课程管理、教师信息管理、成绩管理和系统配置管理。系统将提供用户友好的界面,支…

【Linux】图解详谈HTTPS的安全传输

文章目录 1.前置知识2.只使用对称加密3.只使用非对称加密 因为私钥加密只能公钥解开,公钥加密只能私钥解开4.双方都是使用非对称加密5.非对称加密 对称加密6.非对称加密对称加密CA认证(一)CA认证(二)https &#xff0…

耳夹式耳机哪个牌子好?主流耳夹式耳机推荐,多维度耳夹式耳机测评

耳夹式耳机哪个牌子好?耳机已经逐渐走进了众多消费者的生活,可以非常便捷地满足人们的对声音的需求,无论是在享受音乐还是接听电话方面都非常方便,极大地提升了生活的便利性。然而,随着耳夹式耳机的热度不断攀升&#…

IDEA插件开发入门

前置条件: Java17、Gradle8 1. 安装插件 Plugin DevKit 2. 新建项目 File → New → Project 3. 项目结构 📢 新建一个XxxAction 4. 插件入口 XxxAction 继承 AnAction ,实现 actionPerformed 方法,这是一个插件的入口 5. 插件配置 …

裸辞后勇闯AI领域:我的AGI产品经理之路

2021 年,我开始接触生成式 AI。2023 年 8 月,我按捺不住内心对 AI 技术浪潮的热情,从外企裸辞投身 AI。2023 年,我们团队先后入围由百度和阿里组织的 AGI 黑客马拉松活动,并在阿里第三季 AI 创客松中获得“从 0 到 1 奖…

远程唤醒局域网主机技术Wake On LAN

WOL用途 如果你在开发一个计算机管理软件(利旧现有主机,实现统一运维管理),例如电脑课开课前老师一键开启电教室的电脑 。 魔法原理 Wake-on-LAN 的原理其实很简单。我们发送一个特殊的网络包(俗称"魔术包&quo…

学生党头戴式蓝牙耳机怎么选?平价学生党头戴式蓝牙耳机排行推荐

在选择适合学生党的头戴式蓝牙耳机时,我们不仅要考虑价格因素,还要兼顾音质、舒适度、降噪效果、续航能力以及是否具备实用的功能等多个方面,那么学生党头戴式蓝牙耳机怎么选?作为学生群体,我们既追求性价比&#xff0…

微软推出GRIN-MoE:开创专家路由新范式

前沿科技速递🚀 在人工智能领域,模型的性能和可扩展性一直是研究的热点。微软最近推出的GRIN-MoE(Gradient-Informed Mixture-of-Experts)模型,以其独特的架构和显著的性能表现,正引领着AI技术的前沿&#…

南沙csp-j/s一对一家教 解一本通题: 1937:【06NOIP普及组】数列

【题目描述】 给定一个正整数k(3≤k≤15),把所有k的方幂及所有有限个互不相等的k的方幂之和构成一个递增的序列,例如,当k3时,这个序列是: 1,3,4,9,10,12,13&a…

一文读懂Ingress-Nginx以及实践攻略

一文读懂Ingress-Nginx以及实践攻略 目录 1 概念 1.1 什么是Ingress? 1.1.1 主要功能: 1.2 Ingress的组件1.3 什么是ingress-nginx1.4 ingress-nginx优点和限制1.5 版本兼容性矩阵 2 实践: Ingress nginx部署 2.1 使用helm部署ingress-ngin…

cscode搭建vue项目

创建前安装环境 ctrlj弹出终端 window需要管理员运行并且授权 node -v #显示版本号,说明 node 已经装好 npm -v #显示版本号,说明 npm 可以使用 # 安装cnpm npm install -g cnpm --registryhttps://registry.npm.taobao.org cnpm -v #显示版本号&…

10分钟制作一个简易的word模版

简易word模板制作。 简言 自用的一个word模版,平常套用其他格式的模板,常常将注意力转移到寻找word模版上,这里提供一个简易的word模版制作教程。 格式要求 (1)正文格式字体小四,中文宋体,西…