AVL和二叉树介绍

news2025/1/21 9:29:03

AVL tree介绍

AVL的全称是:Adelson-Velsky-Landis,是发明这种高度平衡二叉树的人名的缩写,AVL tree是一种优化了的搜索二叉树。

这是二叉排序树会存在的一个问题,先看案例:

给定一个数列为{1,2,3,4,5,6},将这个数列转换为二叉排序树

在这里插入图片描述

根据二叉排序树的性质可以得到这样的二叉排序树,这样的树有这么几个问题:

  • 左子树全部为空,从形式上看更像是一个链表
  • 对于二叉树的插入速度没有影响
  • 查询速度明显降低(需要依次比较),不能发挥出二叉排序树的特点

由于这样的情况,便可以引出平衡二叉树,平衡二叉树就可以完美的解决这个问题

  • 平衡二叉树也叫二叉搜索树又被称为AVL树,可以保证拥有较高的查询效率
  • AVL树具有以下特点,它是一颗空树,或它的左右两个子树的高度差(平衡因子)的绝对值不超过1,并且左右两个子树都是一颗平衡二叉树。

1.举例说明

在这里插入图片描述

二叉树的存储结构

顺序存储

        二叉树的顺序存储采用的存储结构是顺序表(数组)。但是只有完全二叉树才可以使用顺序表存储。如果想要存储普通二叉树,我们就要先将普通二叉树转换为完全二叉树。

        普通二叉树转完全二叉树的方法很简单,只需给二叉树额外添加一些节点,将其"拼凑"成完全二叉树即可。

上图中,左侧是普通二叉树,右侧是转化后的完全(满)二叉树。
解决了二叉树的转化问题,接下来学习如何顺序存储完全(满)二叉树。
完全二叉树的顺序存储,仅需从根节点开始,按照层次依次将树中节点存储到数组即可。

完全二叉树在数组的存储状态:

 

存储由普通二叉树转化来的完全二叉树也是如此:

从顺序表中还原完全二叉树也很简单。我们知道,完全二叉树具有这样的性质,将树中节点按照层次并从左到右依次标号(1,2,3,...),若节点 i 有左右孩子,则其左孩子节点为 2*i,右孩子节点为 2*i+1。此性质可用于还原数组中存储的完全二叉树。

链式存储

  因为并不是每个二叉树都是完全二叉树,所以普通二叉树在转换成完全二叉树时,会徒增很多空结点,这些空结点还都需要存储在数组中,这无疑对内存空间造成了大量的浪费。

        所以。树的存储我们经常采用的是链式存储结构。

采用链式存储二叉树时,其节点结构由 3 部分构成:

  • 指向左孩子节点的指针(Lchild);
  • 节点存储的数据(data);
  • 指向右孩子节点的指针(Rchild);

如图:

表示结点结构的C语言代码: 

 typedef struct BiTNode{

 TElemType data;//数据域

 struct BiTNode *lchild,*rchild;//左右孩子指针

 struct BiNode *parent;//父结点指针

 }BiTNode,*Bi

通常情况下也可不写父结点指针,这是为了我们方便找到结点的父结点而写的。

  

这样的链表结构,通常称为三叉链表。

查找二叉树

 二叉查找树(Binary Search Tree),又被称为二叉搜索树。设x为二叉树中的一个节点,x节点包含关键字Key,节点x的Key值记为Key[x]。如果y是x的左子树中的一个节点,则Key[y]<=Key[x];如果y是x的有子树的一个节点,则Key[y]>=Key[x]。
  

查找规则

 1、若任意节点的左子树不空,则左子树上所有的值均小于根节点的值

 2、若任意节点的右子树不空,则右子树上所有节点的值均大于根节点的值(更大于左子树上的值)

3、任意节点的左、右子树也分别为二叉查找树

4、没有键值相等的节点
 

深度为k的二叉树最少有k个节点,最多有2的k次方减1个节点。

最少:斜二叉树,已经退化为线性结构。
最多:每层的节点个数为2的k次方,根目录为0层,即K的值为0。

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

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

相关文章

【Blender】学习一下

简介Download使用教程入门常识界面简介编辑器视图Layout游标对物体的操作 实战案例1. 萌三兄弟——建模、渲染2. 积木组合——建模、渲染、动画制作3. 金币基站——建模、渲染4. 狂奔的小车——建模、渲染、动画5. 荧光树桩——雕刻、建模、渲染6. 子弹冲击——建模、渲染、动画…

Hum Brain Mapp | 联合连接矩阵独立成分分析:结构和功能连接的自动链接

导读 对人类大脑连接的研究&#xff0c;包括结构连接(SC)和功能连接(FC)&#xff0c;这些方面的研究有助于深入了解大脑功能的神经生理机制及其与人类行为和认知的关系。这两种类型的连接测量都提供了重要且互补的信息。然而&#xff0c;将这两种模式整合到一个单一的框架中仍…

AutoCV番外:Transformer

目录 Transformer前言1. Self-attention1.1 前置知识1.2 Self-attention机制1.3 矩阵乘法角度理解1.4 Multi-head Self-attention1.5 Positional Encoding1.6 Many application 2. Transformer2.1 前置知识2.2 Encoder2.3 AT Decoder2.4 NAT Decoder2.5 Cross attention2.6 Tra…

如何区分比特率、波特率和频谱带宽?

01、什么是比特率和波特率&#xff1f; 宽带网络里面提及的千兆即1000Mbit/s&#xff0c;一般描述的是我们家网络端口每秒最大可接收0、1比特&#xff08;bit&#xff09;的数量&#xff0c;即每秒可接收1000x106个比特。显而易见&#xff0c;比特率越高&#xff0c;每秒传送的…

利用resnet50模型实现车牌识别(Python代码,.ipynb和.py两种文件保存都有,可以使用jupyter或pycharm运行)

1.代码的主要流程如下&#xff1a; 导入所需的库和模块。对数据集进行可视化&#xff0c;随机选择一些图像进行展示。加载图像数据集&#xff0c;并将图像和标签存储在数组中。对标签进行独热编码。划分训练集和测试集。使用图像数据增强技术增加训练数据的多样性。定义一些评…

让ChatGPT成为全科医生的智能助理

医生问诊 医疗健康是所有人都关心的话题。涉及医疗健康领域的信息化事件&#xff0c;无论是搜索引擎推荐和广告信息&#xff0c;还是互联网挂号&#xff0c;或者电子商务在线买药&#xff0c;经常能引发社会性讨论。有了 ChatGPT&#xff0c;我们自然也会期待在医疗健康领域&a…

从零开始学习JVM(一)--初识Java虚拟机

1 虚拟机与Java虚拟机 1.1 基本介绍 所谓虚拟机&#xff08;Virtual Machine&#xff09;。就是一台虚拟的计算机。它是一款软件&#xff0c;用来执行一系列虚拟计算机指令。大体上&#xff0c;虚拟机可以分为系统虚拟机和程序虚拟机。 系统虚拟机&#xff1a;完全对物理计算…

(赠书活动第1期) Java 8 已无法满足需求?升级到 Java 17 让你体验酣畅淋漓的编程!

Java 8 已无法满足需求&#xff1f;升级到 Java 17 让你体验酣畅淋漓的编程&#xff01; Java 17 的新特性如何升级到 Java 17❤️‍&#x1f525; 本期赠书三本《JAVA核心技术 卷2》 Java 8 是一个历史悠久的版本&#xff0c;自推出以来一直被广泛使用。但是随着时间的推移和技…

四举措实现数电票对企业经营的改善

数电票不仅是征管需求&#xff0c;也是企业业务的需求。 2021年3月&#xff0c;中共中央办公厅、国务院办公厅印发的《关于进一步深化税收征管改革的意见》&#xff08;以下简称《意见》&#xff09;提出&#xff0c;要全面推进税收征管数字化升级和智能化改造&#xff0c;把智…

Spark大数据处理讲课笔记4.2 Spark SQL数据源 - 基本操作

文章目录 零、本讲学习目标一、基本操作二、默认数据源&#xff08;一&#xff09;默认数据源Parquet&#xff08;二&#xff09;案例演示读取Parquet文件1、在Spark Shell中演示2、通过Scala程序演示 三、手动指定数据源&#xff08;一&#xff09;format()与option()方法概述…

解密Netty中的Reactor模式

文章目录 单线程Reactor模式多线程Reactor模式Reactor模式中IO事件的处理流程Netty中的通道ChannelNetty中的反应器ReactorNetty中的处理器HandlerNetty中的通道Channel和处理器Handler的协作组件Pipeline Reactor(反应器)模式是高性能网络编程在设计和架构方面的基础模式.Doug…

【MySQL速通篇004】这可能最详细的关于MySQL基础知识点的文章了

&#x1f341;前言 &#x1f451;作者主页&#xff1a;CSDN丨博客园 &#x1f3c6;学习交流&#xff1a;在下周周ovoの社区 &#x1f48e;这篇8000多字的博客也是花了我比较久的时间&#xff0c;基本覆盖很大一部分的MySQL知识点&#xff0c;可以说是非常的详细&#xff0c;感谢…

【我的创作纪念日】IC人仍在路上,不停歇……

机缘 平台今天提示我已经坚持创作3年了。如果不提醒的话&#xff0c;我自己都没什么感觉。三年时间说长也不长&#xff0c;说短呢&#xff0c;其实也不短了。截止今天我在CSDN累计发文213篇&#xff0c;上传资源117个。涉及领域包含&#xff1a;数字信号处理、FPGA设计、IC设计…

【自制视频课程】C++OpnecV基础35讲——序言

OpenCV简介 OpenCV是一个开源的计算机视觉库&#xff0c;它可以用于图像处理、计算机视觉、机器学习等领域。OpenCV最初是由英特尔公司开发的&#xff0c;后来成为了开源项目&#xff0c;现在由OpenCV开源社区维护。OpenCV提供了丰富的图像处理和计算机视觉算法&#xff0c;包括…

【YOLO】Windows 下 YOLOv8 使用 TensorRT 进行模型加速部署

本文全文参考文章为 win10下 yolov8 tensorrt模型加速部署【实战】 本文使用的代码仓库为 TensorRT-Alpha 注&#xff1a;其他 Yolov8 TensorRT 部署项目&#xff1a;YOLOv8 Tensorrt Python/C部署教程 一、前期准备工作 安装Visual Studio 2019或者Visual Studio 2022、Nvidi…

Shell脚本文本三剑客之awk编辑器(人类从不掩饰探索星空的愿望)

文章目录 一、awk简介二、awk工作原理三、awk命令格式四、awk命令的使用1.print操作按行输出文本2.print操作按字段截取输出文本3.使用BEGIN和END指定操作5.使用操作getline6.使用操作OFS7.配合数组使用 一、awk简介 awk是linux的一个强大的命令&#xff0c;具备强大的文本格式…

puppeteer-不需重构,无痛加强vue单页面应用的SEO,提升百度收录排名

背景 最近产品觉得我们网站在百度收录上排名太靠后了&#xff0c;又不肯花钱&#xff0c;就让我们想办法提升网站的SEO。由于项目是用vue3写的&#xff0c;并且已经迭代多个版本了&#xff0c;用nuxt实在不适宜&#xff0c;当然俺的开发水平也不够&#xff0c;周期也会拉得很长…

字典翻译EasyTrans简单使用分享

前言 最近太忙了&#xff0c;一直按在项目上摩擦&#xff0c;都没有时间写分享了。今天终于市把所有负责的模块都写完了&#xff0c;本次迭代引入了字典翻译&#xff0c;借这个机会顺便分享下。 一、什么是字典翻译 所谓的字典翻译其实简单理解就是一些不常更新的有键值对属性的…

什么是 Java 的内存模型?如何保证安全

Java 的内存模型定义了多线程程序中&#xff0c;不同线程之间如何共享和访问共享变量的规则。Java 内存模型的设计旨在保证线程安全和可见性&#xff0c;同时保证程序的性能。本文将介绍 Java 内存模型的基本概念、线程安全的实现方法以及如何使用 synchronized 和 volatile 关…

yolo 训练

这里写目录标题 分配训练集&Validation数量数据集读取读取全部文件夹替换路径 loss weightNMSBBox_IOUEIou Optimizer 分配训练集&Validation数量 validation_size training_size * validation_ratio / (1 - validation_ratio)training_size 219 validation_ratio …