数据结构-二叉树-AVL树(平衡二叉树)

红黑树是平衡二叉树的一个变种。

一、 产生平衡二叉树的原因。

二叉搜索树的问题在于极端场景下退化为类似链表的结构,所以搜索的时间复杂度就变成了O(N)。为了保证二叉树不退化为链表,我们必须保证二叉树的的平衡性。

二叉平衡搜索树就是解决上面的问题的。就是AVL树和红黑树

拓展就是多叉平衡二叉树,那就是B树系列。然后哈希表也可以搜索。

二、二叉平衡树的概念。

当二叉搜索树中插入新节点后,如果能保证每个节点的左右子树高度只差的绝对值不超过1.即可降低树的高度,从而减少平均搜索的长度

一棵AVL树或者空树,或者是具有以下性质的二叉搜索树

它的左右子树都是AVL树,左右子树高度之差(平衡因子)的绝对值不超过1。增删查改:高度次 -O(logN)

三、平衡二叉树的插入。

在插入时,我们可以先构造二叉搜索树。然后再进行平衡操作。

1、新增在左边,parent平衡因子要减减

2、新增在右边,parent平衡因子要加加

3、更新后parent平衡因子==0,说明parent所在的子树的高度不变,不会影响祖先,不用再继续沿着到root的路径往上更新。插入完成

4、更新后parent平衡因子==负1or1,说明parent所在的子树的高度变化,会影响祖先,再继续沿着到root的路径往上更新。

5、更新后parent平衡因子 == 2or负2,说明parent所在的子树的高度变化且不平衡。对parent所在子树进行旋转,让它平衡。插入结束。

 6、更新到根节点也是一种插入结束的情况。那么如何进行平衡呢   

我们这里需要用到旋转平衡。

旋转的时候需要注意的问题。

1、保持它是搜索树

2、变成平衡树且降低整棵树的高度

左单旋:

核心操作就是parent->right = cur->left;cur->left = parent; 

这么做的原因是:cur->left一定比parent要大。然后放在parent的右边是符合搜索树的定义的。

 

注意要修改父亲,还要注意curleft为空的情况。修改平衡因子。还有要把子树跟原来的树连接

如果是独立的树 parent  == _root,进行parent->_parent置空。

如果不是独立的树我们需要对parent->_parent进行保存为ppnode,然后进行判断子树是属于ppnode的左子树还是右子树修改ppnode的左右子树为cur,然后修改cur的父亲指针。

抽象图的解释:

插入之前abc为符合AVL规则的子树。 无论是哪种情况,我们的旋转过程是不变的。插入前的AVL树有无数种情况,我们需要使用抽象图来表示。

双旋:

分为先左后右,先右后左

上面只是先右后左的图片。

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

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

相关文章

[AIGC] MyBatis-Plus 动态数据源

在现代的软件开发中,数据源的管理是一个重要的方面。MyBatis-Plus 提供了一种方便的方式来使用动态数据源。 动态数据源意味着在运行时可以根据不同的条件或需求动态地选择不同的数据源。这为应用程序提供了更大的灵活性和可扩展性。 MyBatis-Plus 的动态数据源功…

阿里云宣布:全面赶超GPT-4

5月9日,阿里云正式发布通义千问2.5,阿里云表示,该模型性能全面赶超GPT-4 Turbo。#阿里云宣布全面赶超GPT4# 据介绍,相比通义千问2.1版本,通义千问2.5的理解能力、逻辑推理、指令遵循、代码能力分别提升9%、16%、19%、…

web API设计笔记

Hello , 我是小恒。今晚就讲讲我在开发维护API后的经验分享,当然我知识有限,暂时也不会写实际操作。GitHub项目仓库有一堆还在前期开发,我的时间很多时间投在了开源上。 推荐书籍 我认为一个好的 API 设计是面向用户的,充分隐藏底…

深入探索Android应用数据共享之ContentProvider

本文将深入探讨Android开发中非常重要的数据共享机制 - ContentProvider。 主要内容包括: ContentProvider的基本定义及特点如何实现一个自定义的ContentProviderContentProvider对外提供的功能以及对外部应用的权限控制对ContentProvider的一些常见使用场景使用ContentProvi…

OpenGL入门第一步:创建窗口、重写虚函数

1、创建一个QOpenGLWidget 子类 2、重写虚函数 initializeGL:设置OpenGL资源和状态。在第一次调用resizeGL()或paintGL()之前被调用一次。 resizeGL :窗口尺寸变化时调用。 paintGL: 窗口更新时调用,渲染 OpenGL 场景。 makeCu…

最详尽的网络安全学习路线!涵盖所有技能点,带你成为网安专家!

目录 零基础小白,到就业!入门到入土的网安学习路线! 建议的学习顺序: 一、夯实一下基础,梳理和复习 二、HTML与JAVASCRIPT(了解一下语法即可,要求不高) 三、PHP入门 四、MYSQL…

Marin说PCB之国产电源芯片方案 ---STC2620Q

随着小米加入的造车大家庭,让这个本来就卷的要死的造车大家庭更加卷了。随之带来的蝴蝶效应就是江湖上各个造成门派都开始了降本方案的浪潮啊,开始打响价格战了。各家的新能源车企也是不得不开始启动了降本方案的计划了,为了应对降价的浪潮。…

CountDownLatch、CyclicBarrier 和 Semaphore

文章目录 一、CountDownLatch1、实现原理2、使用场景3、代码 二、CyclicBarrier1、实现原理2、使用场景3、代码4、CountDownLatch与CyclicBarrier区别 三、Semaphore1、实现原理2、使用场景3、代码 四、总结 一、CountDownLatch CountDownLatch计数器 1、实现原理 主要基于计…

Window7镜像注入USB驱动,解决系统安装后无法识别USB

Window7镜像注入usb驱动 Window7镜像注入usb驱动方法一方法二 Window7镜像注入usb驱动 一般4代酷睿之后的主机需要安装usb驱动才能驱动usb,导致很多Windows原版镜像安装后无法识别usb键盘 方法一 1.直接采购PS2 接口键盘、PS2 接口鼠标 方法二 使用联想镜像注入…

李飞飞团队 AI4S 最新洞察:16 项创新技术汇总,覆盖生物/材料/医疗/问诊……

不久前,斯坦福大学 Human-Center Artificial Intelligence (HAI) 研究中心重磅发布了《2024年人工智能指数报告》。 作为斯坦福 HAI 的第七部力作,这份报告长达 502 页,全面追踪了 2023 年全球人工智能的发展趋势。相比往年,扩大了…

AOF持久化是怎么实现的?

AOF持久化是怎么实现的? AOF 日志三种写回策略AOF 重写机制AOF 后台重写总结参考资料 AOF 日志 试想一下,如果 Redis 每执行一条写操作命令,就把该命令以追加的方式写入到一个文件里,然后重启 Redis 的时候,先去读取这…

微信小程序开发秘籍:掌握数据缓存与离线存储的艺术

微信小程序开发秘籍:掌握数据缓存与离线存储的艺术 基本概念数据缓存离线存储 技术要点与实战1. 使用wx.setStorageSync进行简单数据缓存2. 管理复杂数据结构——使用wx.setStorage3. 离线存储策略设计4. 安全性与性能优化 结语与探讨 在微信小程序的开发过程中&…

如何在树莓派上的ubuntu20.04.5上安装ros YDLidar SDK ydlidar driver

参考文章: 安装ros1: how to install ros1 on rasberry pi: https://varhowto.com/install-ros-noetic-ubuntu-20-04/ 安装完ros1后安装 ydlidar sdk 和 ydlidar driver: 参考这个手册: https://www.ydlidar.com/Public/upload/files/20…

在k8s中部署hadoop后的使用,包括服务端及客户端(客户端的安装及与k8s服务的对接)

(作者:陈玓玏) 在https://blog.csdn.net/weixin_39750084/article/details/136744772?spm1001.2014.3001.5502和https://blog.csdn.net/weixin_39750084/article/details/136750613?spm1001.2014.3001.5502这两篇文章中,说明…

Verilog复习(一)| 模块的定义

模块(module)是Verilog的基本描述单位,用于描述某个设计的功能或结构,及其与其他模块通信(连接)的外部端口。 Verilog程序由关键词module和endmodule进行定义。 定义模块的步骤: 定义模块的端…

保研面试408复习 4——操作系统、计网

文章目录 1、操作系统一、文件系统中文件是如何组织的?二、文件的整体概述三、UNIX外存空闲空间管理 2、计算机网络一、CSMA/CD 协议(数据链路层协议)二、以太网MAC帧MTU 标记文字记忆,加粗文字注意,普通文字理解。 1、…

全平台 GUI库, 物联网,嵌入式,单片机,桌面应用都行

跨平台最小头文件GUI库 GuiLite是一个轻量级、高效的GUI库,拥有仅4千行的C代码,且零依赖,采用单一头文件库(GuiLite.h)。这个库不仅提供高效渲染,即使在单片机上也能流畅运行,展现了卓越的性能表…

MySQL 单表访问

MySQL执行单表查询 1.访问方法: Const MySQL直接利用主键值在聚簇索引中定位对应的用户记录.并且唯一的二级索引也可以在常数时间内定位到一条记录. 这种const访问方法只能在主键列或者唯一二级索引与一个常数进行等值比较才有效. ref 普通的二级索引列与常数进行等值比较,会形…

大模型日报2024-05-05

大模型日报 2024-05-05 大模型新闻: Techs new arms race: The billion-dollar battle to build AI - 小型专业化模型可以为各种细分应用提供关键的、高效的能力,这是AI行业必须要支持的。来源:VentureBeatGenerative AI on Agenda for Next CIECA Webin…

使用llama.cpp量化部署LLM

以llama.cpp工具为例,介绍模型量化并在本地部署的详细步骤。这里使用 Meta最新开源的 Llama3-8B 模型。 1 环境 系统应有make(MacOS/Linux自带)或cmake(Windows需自行安装)编译工具Python 3.10以上编译和运行该工具 …