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

文章出处:数据结构和算法之树形结构(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); // 先左旋左节点,对应RRreturn 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.xdnf.cn/news/148957.html

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

相关文章

力扣上刷题之C语言实现-Days1

一. 简介 本文记录一下力扣的逻辑题。主要是数组方面的,使用 C语言实现。 二. 涉及数组的 C语言逻辑题 1. 两数之和 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target的那 两个 整数,并返回它们的…

vmware 虚拟机多屏幕或添加屏幕

vmware 虚拟机多屏幕或添加屏幕 前置条件 vmware 安装 vmware tools 虚拟机系统支持多屏幕 物理上有至少两个屏幕,就是物理机上接至少一个屏幕 方法 虚拟机上点设置,需要在虚拟机关机时进行 ctrl alt enter 让当前虚拟机全屏 鼠标移动到屏幕虚拟机…

双路创新深度学习!TCN-Transformer+LSTM多变量时间序列预测(Matlab)

双路创新深度学习!TCN-TransformerLSTM多变量时间序列预测(Matlab) 目录 双路创新深度学习!TCN-TransformerLSTM多变量时间序列预测(Matlab)效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab…

Vue使用Vue Router路由:通过URL传递与获取参数

Vue Router 路由实际上就是一种映射关系。例如,多个选项卡之间的切换就可以使用路由功能来实现。在切换时,根据鼠标的点击事件显示不同的页面内容,这相当于事件和事件处理程序之间的映射关系。在实际的开发中,经常需要通过URL来传…

Invalid Executable The executable contains bitcode

Invalid Executable The executable contains bitcode xcode世界xcode16后,打包上传testflight时三方库报错:Invalid Executable - The executable ***.app/Frameworks/xxx.framework/xxx contains bitcode. 解决方案: 执行一下指令删除该f…

JavaScript中Windows对象下的属性和方法

1.Windows对象概念 所有的浏览器都支持Windows对象。它表示浏览器窗口 2.Boom概念 Boom:是指浏览器对象模型,它使javaScript有能力与浏览器进行对话 3.DOM概念 DOM:是指文档对象模型,通过它可以访问HTML文档中的所有元素 HT…

导入时,Excel模板不被下载

问题描述 提示:这里描述项目中遇到的问题: 这是个SSM项目,以前经常遇到这个问题,今天有幸记录下来 [ERROR][o.a.s.r.StreamResult] Can not find a java.io.InputStream with the name [downLoadFile] in the invocation stack…

多数元素-简单

169. 多数元素 - 力扣(LeetCode) 【LeetCode 每日一题】169. 多数元素 | 手写图解版思路 代码讲解_哔哩哔哩_bilibili c为计数器,代表当前候选人的票数 v为当前候选人 x为遍历的各候选人得票 分三种情况: 第一种,c…

MFC - 复杂控件_1

前言 各位师傅大家好,我是qmx_07,今天给大家讲解复杂控件的相关知识点 复杂控件 进度条 绘图准备: 调整windows窗口大小、设置 Progress Control 进度条设置Button 按钮 添加进度条变量 m_Progress,通过按钮触发 void CMFCApplication2Dlg::OnBnCl…

C++ set 和 map学习

一、set(multiset)的基本知识和使用 set也是一种我们直接可以使用的容器&#xff0c;使用应该包含 #include <set> 这个头文件。此处暂且不讨论其底层&#xff0c;只探讨set如何使用即可。 我们看到&#xff0c;set 的模板参数有三个&#xff0c;第一个就是其存储的数据…

【操作系统强化】王道强化一轮笔记

第一章 计算机系统概述 考点1 操作系统的概念、特征和功能 1. 2. 考点2 内核态与用户态 1. 2.用户态和内核态之间的切换本质上就是应用程序和操作系统对CPU控制器的切换 考点3 中断和异常 1. 2. 考点4 系统调用 1. 2. 3.C 考点5 操作系统引导 1. 2. ①磁盘的物理格式化&…

ERNIESpeed-128K在线智能聊天机器人项目(附源码)

本项目是基于百度千帆的智能聊天模型ERNIESpeed-128K开发的 一、技术栈 后端&#xff1a;java8springboot2.6.13 数据库&#xff1a;MongoDB 前端&#xff1a;vue2element-uimarked&#xff08;md格式&#xff09; 二、MongoDB与对话存储的设计 使用MongoDB来储存对话&am…

戎易大数据 | 数据分析实操篇:基于MySQL和Tableau的淘宝用户购物行为数据分析

本文来源公众号“戎易大数据”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;数据分析实操篇&#xff1a;基于MySQL和Tableau的淘宝用户购物行为数据分析 1项目介绍 为提高平台GMV和实现精细化运营&#xff0c;本项目首先使用My…

领夹麦克风哪个品牌好,无线领夹麦克风品牌排名,麦克风品牌大全

无线领夹麦克风因其便携性和隐蔽性&#xff0c;越来越受到演讲者和表演者的青睐。但是&#xff0c;随着市场上品牌和型号的增多&#xff0c;质量也变得参差不齐。许多用户在选购时&#xff0c;会因为缺乏了解而选择到性能不佳的产品&#xff0c;影响声音的清晰度和稳定性。下面…

预计2030年全球半导体用超高纯氢气市场规模将达到2.5亿美元

超高纯度氢气是半导体制造行业使用的关键气体&#xff0c;其纯度通常为 99.999% (5N) 或更高。这种纯度水平对于避免引入可能损害半导体器件性能和可靠性的杂质至关重要。在半导体生产中&#xff0c;超高纯度氢气用于化学气相沉积 (CVD)、外延生长、退火和表面清洁等关键工艺。…

java基础(2)方法的使用

目录 1.前言 2.正文 2.1方法的定义 2.2方法的调用过程 2.3方法的实参与形参 2.3.1形参 2.3.2实参 2.3.3参数传递 2.4方法的重载 3.小结 1.前言 哈喽大家好啊&#xff0c;今天博主继续带领大家学习java的基本语法&#xff0c;java的基础语法部分打算用六到七篇博文完…

Undet for sketchup 2023.3注册机 支持草图大师sketchup2021-2022-2023

1.Undet for sketchup 2023.3支持草图大师sketchup2021-2022-2023。支持机载雷达扫描、车载扫描还是地面扫描&#xff0c;对AEC行业用户来说&#xff0c;真正需要的是如何将这些数据快速处理为三维模型&#xff0c;这样才能将这些信息延展到BIM领域发挥效用。因此面对这些海量的…

Facebook开发者篇 - API拉取广告投放数据对接流程

大家好&#xff0c;我是牢鹅&#xff01;相信大家做出海&#xff0c;很多人会考虑在Facebook这样的大平台买量&#xff0c;但是每次登入Facebook的广告后台看数据很麻烦&#xff0c;又要科学上网&#xff0c;又要拉数据下来作进一步的分析&#xff0c;赚刀乐总是慢人一步。所以…

PHP基础语法讲解

​ 大家好&#xff0c;我是程序员小羊&#xff01; 前言&#xff1a; PHP&#xff08;Hypertext Preprocessor&#xff09;是一种常用于网页开发的服务器端脚本语言&#xff0c;易于学习并且与 HTML 紧密结合。以下是 PHP 的基础语法详细讲解。 1. PHP 基础结构 1.1 PHP 脚本结…

kubernetes网络(二)之bird实现节点间BGP互联的实验

摘要 上一篇文章中我们学习了calico的原理&#xff0c;kubernetes中的node节点&#xff0c;利用 calico 的 bird 程序相互学习路由&#xff0c;为了加深对 bird 程序的认识&#xff0c;本文我们将使用bird进行实验&#xff0c;实验中实现了BGP FULL MESH模式让宿主相互学习到对…