高级树结构

news2024/11/17 16:33:23

二叉排序树

  • 左子树中所有结点的值,均小于其根结点的值。

  • 右子树中所有结点的值,均大于其根结点的值。

  • 二叉搜索树的子树也是二叉搜索树。

 注意:

1.二叉查找树不能插入重复元素

2.中序遍历是一个递增的数列

3.高度越小查询效率越高

二叉排序树的删除操作

  1. 要删除的结点是叶子结点。

  2. 要删除的结点是只有一个孩子结点。

  3. 要删除的结点有两个孩子结点。

第一种情况,直接删除就行了

第二种情况,需要将孩子结点连接上去

第三种情况有两个方案:推荐方案1

1. 选取其左子树中最大结点上位
2. 选择其右子树中最小结点上位

平衡二叉树

为弥补排序树因不平衡而导致查询效率下降的情况,从而推出平衡二叉树(AVL树)

性质

  • 平衡二叉树一定是一棵二叉排序树。

  • 任意结点的左右子树也是一棵平衡二叉树。

  • 从根节点开始,左右子树都高度差(平衡因子)不能超过1,否则视为不平衡

平衡因子:二叉树上节点的左子树高度减去右子树高度

插入操作

当插入之后,不再满足平衡二叉树的定义时,就出现了失衡的情况,而对于这种失衡情况,为了继续保持平衡状态,就需要进行处理

根据插入结点的不同偏向情况,分为LL型、LR型、RR型、RL型

LL型调整(右旋)

RR型调整(左旋)

RL型调整(先右旋,再左旋)

LR型调整(先左旋,再右旋)

删除操作类似,在删除之后判断是否平衡,如果不平衡同样需要进行旋转操作  

红黑树

二叉平衡树,通过在插入结点时维护树的平衡,这样就不会出现极端情况使得整棵树的查找效率急剧降低了。因为一旦平衡因子的绝对值超过1那么就失衡,这样每插入一个结点,就有很大的概率会导致失衡,能否不这么严格,但同时也要在一定程度上保证平衡呢?这就要提到红黑树了

 它并不像平衡二叉树那样严格要求高度差不能超过1,但需要满足五个规则

  • 规则1:每个结点可以是黑色或是红色。

  • 规则2:根结点一定是黑色。

  • 规则3:红色结点的父结点和子结点不能为红色,也就是说不能有两个连续的红色。

  • 规则4:所有的空结点都是黑色(空结点视为NIL,红黑树中是将空节点视为叶子结点)

  • 规则5:每个结点到空节点路径上出现的黑色结点的个数都相等。

插入节点

通过变色和旋转来保持原有的性质

变色:直接将父结点和其兄弟结点同时修改为黑色(兄弟结点变成黑色,因为要满足性质5)然后将爷爷结点改成红色,当爷爷结点为根结点时再变回黑色

  • 如果整棵树为NULL,直接作为根结点,变成黑色。

  • 如果父结点是黑色,直接插入就完事。

  • 如果父结点为红色,且父结点的兄弟结点也是红色,直接变色即可

  • 如果父结点为红色,但父结点的兄弟结点为黑色,需要先根据情况(LL、RR、LR、RL)进行旋转,然后再变色。

B树

B树(Balance Tree),是专门为磁盘数据读取设计的一种度为 m 的查找树(多用于数据库)它同样是一棵平衡树,但是不限于二叉,前面的二叉树都是基于内存读取的优化,这个是磁盘读取的优化,一棵度为4的(4阶)B树

 规则

  1. 树中每个结点最多含有m个孩子(m >= 2)比如上面就是m为4的4阶B树,最多有4个孩子。

  2. 除根结点和叶子结点外,其它每个结点至少有⌈m/2⌉个孩子,同理键值数量至少有⌈m/2⌉-1个。

  3. 若根结点不是叶子结点,则至少有2个孩子。

  4. 所有叶子结点都出现在同一层。

  5. 一个结点的包含多种信息(P0,K1,P1,K2,…,Kn,Pn),其中P为指向子树的指针,K为键值(关键字)

    1. Ki (i=1...n)为键值,也就是每个结点保存的值,且键值按顺序升序排序K(i-1)< Ki

    2. Pi为指向子树的指针,且指针Pi指向的子树中所有结点的键值均小于Ki,但都大于K(i-1)

    3. 除根结点外其他所有的结点的键值个数n必须满足: ⌈m/2⌉-1 <= n <= m-1

插入操作

  • 如果该节点上的元素数未满,则将新元素插入到该节点,并保持节点中元素的顺序。

  • 如果该节点上的元素已满,则需要将该节点平均地分裂成两个节点:

    1. 首先从该节点中的所有元素和新元素中先出一个中位数作为分割值

    2. 小于中位数的元素作为左子树划分出去,大于中位数的元素作为右子树划分。

    3. 分割值此时上升到父结点中,如果没有父结点,那么就创建一个新的父节点

  • 因为要满足B树第四条规则:所有叶子结点都出现在同一层,当叶子结点饱满时要向上划分

删除操作

  • 若删除的是叶子结点的中元素:

    • 正常情况下直接删除。

    • 如果删除后,键值数小于最小值,那么需要找兄弟借一个。

    • 要是没得借了,直接跟兄弟结点、对应的分割值合并。

  • 若删除的是某个根结点中的元素:

    • 一般情况会删掉一个分割值,删掉后需要重新从左右子树中找一个新分割值的拿上来。

    • 要是拿上来之后左右子树中出现键值数小于最小值的情况,那么就只能合并了。

上述两个操作执行完后,还要继续往上看上面的结点是否依然满足性质,否则继续处理,直到稳定

与红黑树的关系

红黑树4阶B树具有等价性,其中黑色结点就是中间的(黑色结点一定是父结点),红色结点分别位于两边,通过将黑色结点与它的红色子节点融合在一起,形成1个B树节点,

  • B树叶节点等深实际上体现在红黑树中为任一叶节点到达根节点的路径中,黑色路径所占的长度是相等的,因为黑色结点就是B树的结点分割值。

  • B树节点的键值数量不能超过N实际上体现在红黑树约定相邻红色结点接最多2条,也就是说不可能出现B树中元素超过3的情况,因此是4阶B树。

 B+树

B+树是B树的一种变体,有着比B树更高的查询性能

  1. 有k个子树的中间结点包含有k个元素(B树中是k-1个元素),每个元素不保存数据,只用来索引,所有数据都保存在叶子结点。

  2. 所有的叶子结点中包含了全部元素的信息,及指向含这些元素记录的指针,且叶子结点按照从小到大的顺序连接。

  3. 所有的根结点元素都同时存在于子结点中,在子节点元素中是最大(或最小)元素。

 比较:

B树的查找性能并不稳定,最好的情况是只查根节点即可,而最坏的情况则需要查到叶子节点,B+树每一次查找都是稳定的,因为一定在叶子结点

应用

MySQL就默认选择B+Tree作为索引的存储数据结构

MyISAM存储引擎下的B+Tree实现

 InnoDB存储引擎下的B+Tree实现

哈夫曼树

给定N个权值作为N个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树

选择两棵权值最小的树作为一颗新的树的左右子树,左右顺序不重要(因为哈夫曼编码不唯一),得到的树根结点权值为这两个结点之和,再将这颗子树放回森林,重复上面的操作,继续选择两个最小的出来组成一颗新的树

 然后就可以编码了

 优先级队列

与普通队列不同,它允许插队(权值越大的元素优先排到前面去),出队还是一律从队首出来

必须是一棵完全二叉树,树中父亲都比孩子小的我们称为小根堆(小顶堆),树中父亲都比孩子大则是大根堆(注意不要跟二叉查找树搞混了,二叉查找树是左小右大,而堆只要是孩子一定小或者大),它是一颗具有特殊性质的完全二叉树,同样可以实现优先级队列

 因为完全二叉树比较适合使用数组才存储(因为是按序的)所以说一般堆都是以数组形式存放,并且第一个位置是空的

大顶堆的插入和删除操作

插入:

因为是一棵完全二叉树,那么必须按照顺序,继续在最后一行从左往右插入新的结点,其实就相当于在数组的后面继续加一个新的结点进来,破坏规则时只需和父节点交换即可,并需要持续向上比较和交换,直到稳定为止

删除队首元素

删除最顶上的元素,此时先把排在最后面的拿上来顶替一下,按照与插入相反的方向,从上往下进行堆化操作,规则是一样的,遇到大的就交换,即使完成了出队操作,依然是最大的元素排在队首,并且整棵树依然是一棵完全二叉树

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

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

相关文章

RK3568平台开发系列讲解(驱动基础篇)RK 看门狗的使用

🚀返回专栏总目录 文章目录 一、简介二、DTS配置三、使用沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将对RK 看门狗的使用进行学习。 文章目录 一、简介二、DTS配置三、使用一、简介 看门狗(watchdog)是一个定时器,启动之后会开始计时。系统或者软件需要…

一个非常sb的报错……idea创建项目初始化失败……

今天在用idea创建项目时报错项目初始化失败&#xff1b; 一开始以为是配置原因&#xff0c;但后面尝试创建空项目都失败…… 觉得可能跟版本什么的无关&#xff0c;尝试重启、更新系统后&#xff0c;试着以管理员身份运行idea&#xff0c;问题解决了……………… 如果有报错信…

C语言——结构体初阶

哈喽&#xff0c;大家好&#xff0c;今天我们来学习C语言中的结构体&#xff0c;今天主要学习初阶结构体&#xff0c;后期我们将继续学习结构体进阶。 目录 1.结构体类型的声明 1.1 结构体的基础知识 1.2 结构的声明 1.3 结构成员的类型 1.4 结构体变量的定义和初始化 2. …

Cannot resolve plugin com.spotify:docker-maven-plugin:1.2.2 not found

问题 遇到这个错误是按照ruoyi-clou-plus把插件复制过来的,开始没有版本号&#xff0c;一直爆红&#xff0c;自己随便试了几个版本号&#xff0c;还是提示Cannot resolve plugin com.spotify:docker-maven-plugin not found 过程分析 百度了很多都说在settings.xml中加上 …

Tomcat安装与使用

Tomcat 是HTTP服务器&#xff0c;用于使用HTTP协议。 1、下载Tomcat 下载链接&#xff1a;https://tomcat.apache.org/ 进入官网后&#xff0c;根据自己想要下载的版本进行下载&#xff0c;我这里选择下载的版本是Tomcat 8. 点击选择自己想要下载的对应版本&#xff0c;下载Z…

基于Kruskal和Prim的最小生成树算法[matlab版本]

Kruskal算法 ------------------------------------ Kruskal算法为顺序取边的算法,复杂度与边的数量m有关, 为o(m log2 m).步骤如下: (1)初始化:最小生成树的边集A = ∅,对于图G中每个节点v ∈ V,生成 一个仅包含该节点的子树; (2)将图G中所有的边按照非降序方式排列; (…

YOLOv5、YOLOv7独家原创改进:独家首发最新EfficiCLNMS改进点,改进有效可以直接当做自己的原创改进点来写,新的增强预测帧

💡该教程为属于《芒果书》📚系列,包含大量的原创首发改进方式, 所有文章都是全网首发原创改进内容🚀 💡本篇文章为YOLOv5、YOLOv7改进:独家首发最新EfficiCL-NMS改进点,新的增强预测帧率。 💡对自己数据集改进有效的话,可以直接当做自己的原创改进点来写!!!改…

Trace32 SRST和TRST、system.attach 和 system.up的区别

目录 TRST-Resets the JTAG TAP controller and the CPU internal debug logic SRST- Resets the CPU core and peripherals SYStem.Mode Down SYStem.Mode Nodebug SYStem.Mode Prepare SYStem.Mode Go SYStem.Mode Attach SYStem.Mode StandBy SYStem.Mode Up 下图为…

HLS入门-LED闪烁仿真

什么是HLS HLS&#xff08;High-Level Synthesis&#xff09;是一种硬件描述语言编程技术&#xff0c;它可以将高级语言&#xff08;如C/C&#xff09;转换为硬件描述语言&#xff08;如VHDL或Verilog&#xff09;&#xff0c;以便将其用于FPGA设计中。 HLS有什么核心技术&am…

《嵌入式系统开发实践》实验二 进程与线程

一、 实验目的 了解Linux中进程和线程的概念&#xff1b; 了解多线程程序的基本原理&#xff1b; 了解pthread库&#xff1b; 掌握用system、exec函数族、fork函数创建进程&#xff1b; 掌握使用pthread库中的函数编写多线程程序。 二、 实验任务与要求 应用fork函数创建子进…

行云流水| CI 3.0 云原生构建全新上线

研发过程中&#xff0c;如何直观且准确地获悉代码提交后的质量状态&#xff1f; 引入持续集成&#xff0c;可以自动化的对代码进行代码检查、单元测试、编译构建、甚至部署与发布&#xff0c;大幅提升开发人员的效率。 腾讯云 CODING 推出 CI 3.0 ——云原生构建&#xff0c;是…

LabVIEW:强大的图形化编程工具

LabVIEW&#xff08;Laboratory Virtual Instrument Engineering Workbench&#xff09;是由美国国家仪器公司&#xff08;National Instruments&#xff09;开发的一种直观而强大的工程软件&#xff0c;被广泛应用于各个领域的工程师和科学家之中。 与传统的编程语言相比&…

打包后定义配置文件针对.vue和.js文件不同配置方法

条件&#xff1a;需要打包后形成config文件&#xff0c;在打包后改变此配置文件即可改变配置&#xff0c;如api地址&#xff0c;vue中方法参数和条件。 &#xff08;1&#xff09;首先config文件要在public文件中建立&#xff0c;webpack打包后config文件才会出现在打包的dist文…

SpringMVC第四阶段:Controller中如何接收请求参数

Controller中如何接收请求参数 1、原生API参数类型 1.1、HttpServletRequest类 只需要在Controller的目标方法中, 直接写上HttpServletRequest对象即可获取 原生API的 request对象实例。 RequestMapping(value "/p1") public String param1(HttpServletRequest …

( 动态规划) 1035. 不相交的线 ——【Leetcode每日一题】

❓1035. 不相交的线 难度&#xff1a;中等 在两条独立的水平线上按给定的顺序写下 nums1 和 nums2 中的整数。 现在&#xff0c;可以绘制一些连接两个数字 nums1[i] 和 nums2[j] 的直线&#xff0c;这些直线需要同时满足满足&#xff1a; nums1[i] nums2[j]且绘制的直线不…

Postman如何做接口测试?你居然还不知道

目录 Postman如何做接口测试1&#xff1a;如何导入 swagger 接口文档 Postman如何做接口测试2&#xff1a;如何切换测试环境 Postman如何做接口测试3&#xff1a;什么&#xff1f;postman 还可以做压力测试&#xff1f; Postman如何做接口测试4&#xff1a;如何自动添加请求…

辅助驾驶功能开发-功能规范篇(16)-2-领航辅助系统NAP-自动变道-2

书接上回 2.3.4.3 系统主动变道 (1)变道需求输入 在NOA功能功能激活状态下,系统接收驾驶员请求或根据导航引导信息及道路环境信息获取变换车道的需求,包含导航引导路线的变道需求和智能避让变道需求。 导航引导变道需求 导航引导模式下的主动变道包括上高速由匝道并入主路、…

【前端知识】浅谈XSS和CSRF网络攻击

【前端知识】浅谈XSS和CSRF网络攻击 1. 常见的浏览器攻击2. XSS攻击2.1 定义2.2 类型2.2.1 Reflected XSS【反射型 - 非持久型 XSS】2.2.2 Stored XSS【存储型 - 持久型 XSS】2.2.3 DOM-based or local XSS【基于DOM或本地的XSS &#xff0c;非持久性】2.2.4 其他类型XSS攻击 2…

Python入门(十)用户输入

用户输入 1.概述2.函数input()的工作原理2.1 编写清晰的程序 3.使用int()来获取数值输入4.求模运算符 作者&#xff1a;xiou 1.概述 大多数程序旨在解决最终用户的问题&#xff0c;为此通常需要从用户那里获取一些信息。例如&#xff0c;假设有人要判断自己是否到了投票年龄。…

从C语言到C++_11(string类的常用函数)力扣58和415

目录 1. 学习string的铺垫 1.1 什么是string类 1.2 basic_string 模板类 1.3 编码表的由来 1.4 其它字符编码的string 2. string类对象的常见构造 3. sting类对象的容量操作 4. string类对象的访问及遍历操作 5. string类对象的修改操作 6. string类非成员函数 7. …