二叉搜索树,平衡二叉树,红黑树,B树,B+树

news2024/9/21 12:36:37

文章目录

  • 二叉树(BT)
    • 1. 满二叉树
    • 2. 完全二叉树
  • 二叉搜索树(BST)
  • 平衡二叉搜索树(AVL)
    • 1. 定义
    • 2. 如何保持平衡——旋转
  • 红黑树(RBTree)
    • 1.定义
    • 2.红黑规则
    • 3.插入规则
  • B树
    • 1.定义
    • 2.在磁盘系统中的应用
  • B+树
    • 1.定义
    • 2.应用

二叉树(BT)

树的一些基本概念:

  • 层数:从根结点开始,根结点的层次为1,根的直接后继层次为2,以此类推
  • 树的高度(深度):树中结点的最大层次

注:节点的深度&高度
二叉树节点的深度:指从根节点到该节点的最长简单路径边的条数或者节点数(取决于深度从0开始还是从1开始)
二叉树节点的高度:指从该节点到叶子节点的最长简单路径边的条数或者节点数(取决于高度从0开始还是从1开始)

两种特殊的二叉树:

1. 满二叉树

定义:只有度为0的结点和度为2的结点,并且度为0的结点在同一层上

如图:

2. 完全二叉树

定义:除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2^(h-1) 个节点。

二叉搜索树(BST)

Binary Sort Tree,又称二叉查找树,二叉排序树,是一个有序树

满足以下条件:

  • 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
  • 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
  • 它的左、右子树也分别为二叉搜索树

如图:

在这里插入图片描述

平衡二叉搜索树(AVL)

(注意,平衡二叉搜索树可简称为平衡二叉树,所以有的说法是平衡二叉树一定是二叉搜索树。但单独说平衡二叉树并没有要求是二叉搜索树。当然如果不是考试,死扣概念没有太大意义,所以平衡二叉树大多数情况都是二叉搜索树

1. 定义

【由一个姓 AV 的大佬(G. M. Adelson-Velsky) 和一个姓 L 的大佬( Evgenii Landis)提出。】

它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树(即任意节点高度差不超过1

如图:

2. 如何保持平衡——旋转

当我们在一个平衡二叉树上插入一个结点时,有可能会导致失衡,这时就需要旋转来平衡,那怎么旋转呢?

基本步骤(以左旋为例):

第一步是确定支点:从添加的节点开始,不断的往父节点找不平衡的节点

第二步根据情况的不同

如果是下图情况:

  • 以不平衡的点作为支点
  • 把支点左旋降级,变成左子节点
  • 晋升原来的右子节点

如果是下图情况:

  • 以不平衡的点作为支点
  • 将根节点的右侧往左拉
  • 原先的右子节点变成新的父节点,并把多余的左子节点出让,给已经降级的根节点当右子节点

通常有四种情况

(1)LL:左左,当根节点的左子树的左子树有节点插入时—— 一次右旋

(2)LR:左右,当根节点的左子树的右子树有节点插入时—— 先局部左旋,再整体右旋

(3)RR:右右,当根节点的右子树的右子树有节点插入时—— 一次左旋

(4)RL:右左,当根节点的右子树的左子树有节点插入时—— 先局部右旋,再整体左旋

红黑树(RBTree)

1.定义

(1)一种自平衡的二叉搜索树
(2)不是高度平衡的
(3)特有的红黑规则(来维持平衡)

2.红黑规则

(1)每一个节点或是红色的,或者是黑色的

(2)根节点必须是黑色

(3)如果一个节点没有子节点或者父节点,则该节点相应的指针属性值为Nil,这些Nil视为叶节点,每个叶节点(Nil)是黑色的(注意这里的叶节点是空节点

(4)如果某一个节点是红色,那么它的子节点必须是黑色(不能出现两个红色节点相连的情况)

(5)对每一个节点,从该节点到其所有后代叶节点的简单路径上,均包含相同数目的黑色节点

如图:

在这里插入图片描述

每一个节点的示意图如下(比正常的二叉树节点多了一个颜色)

在这里插入图片描述

3.插入规则

首先明确一点,红黑树在插入一个节点时,效率最高的是插入红节点(如果插入的节点是黑色,那么这个节点所在路径比其他路径多出一个黑色节点,这个调整起来会比较麻烦,如果是红色,就不影响)

所以以下默认插入节点是红色,再根据情况来调整

在这里插入图片描述

B树

1.定义

首先可以把B树看作一个M树,并且允许一个结点中包含多个key,并且满足下列条件:
(1)树中每个结点最多有M-1个key(有M个孩子节点),并且以升序排列

(2)若根节点不是叶子结点,则根结点至少有两个孩子结点

(3)除根节点外,其他结点至少有m/2个孩子结点

(4)所有叶子结点都在同一层上,即B树是所有结点的平衡因子均等于0的多路查找树。

(5)每个节点的结构是:

在这里插入图片描述

其中n表示key的数量,Pi 是指向孩子的指针,ki 是其中一个key的值

B树示意图如下:

在这里插入图片描述

一般可以简画成:

在这里插入图片描述

2.在磁盘系统中的应用

在我们的程序中,不可避免的需要通过IO操作文件,而我们的文件是存储在磁盘上的。计算机操作磁盘上的文件是通过文件系统进行操作的,在文件系统中就使用到了B树这种数据结构。

其实讲到B树和B+树都离不开磁盘系统

在这里插入图片描述

查找文件或者数据都需要索引(更快的查询), 一般是通过 K:V(键值对)的形式,那么怎么设计一个文件系统的索引?(用什么样的数据结构)

如果设计的是线性形式,那查询效率肯定很低

如果设计成哈希表,如下图,会出现哈希冲突也会产生大量线性查询

在这里插入图片描述

又考虑到二叉树,上面介绍了很多种二叉树,都还不够吗?

  • 普通二叉树:数据无序,效率低
  • BST二叉搜索树是有序的,但如果原始数据是有序的,则会退化为线性查找
  • AVL平衡二叉树,当插入频率大于查找时,会消耗性能
  • 红黑树:其实已经解决了上面几种的缺点,但是当数据量很大,查询次数就会增多(数据量大,树的深度就会不断增加)

所以才考虑到B树——多路平衡查找树

由于存储介质的特性,磁盘本身存取就比主存慢很多,为提高效率,要尽量减少磁盘I/O。 所以磁盘往往不是严格按需读取,而是每次都会预读——局部性原理。由于磁盘顺序读取的效率很高(不需要寻道时间,只需很少的旋转时间),因此预读可以提高I/O效率

内存和磁盘发生数据交互时,一般情况下有一个最小逻辑单元,称为页,页一般由操作系统决定多大,一般是4k或者8k,预读的长度一般为页的整倍数

文件系统的设计者利用了磁盘预读原理,将一个结点的大小设为等于一个页(1024个字节或其整数倍),这样每个结点只需要一次I/O就可以完全载入。那么3层的B树可以容纳102410241024差不多10亿个数据(如果换成二叉查找树,则需要30层)

B+树

1.定义

B+树是在B树的基础上又一次的改进(B树非叶子节点存储数据占用内存,因此进行改进)

B+树与B树的区别:

(1)非叶结点仅具有索引作用,也就是说,非叶子结点只存储key,不存储value

(2)树的所有叶结点构成一个有序链表,可以按照key排序的次序遍历全部数据。

在这里插入图片描述
其中Max Degree=3

2.应用

B+树的优点:
(1)由于B+树在非叶子结点上不包含真正的数据,只当做索引使用,因此在内存相同的情况下,能够存放更多的key。
(2)B+树的叶子结点都是相连的,因此对整棵树的遍历只需要一次线性遍历叶子结点即可。而且由于数据顺序排列并且相连,所以便于区间查找和搜索。而B树则需要进行每一层的递归遍历。

参考链接:

https://www.bilibili.com/video/BV1rB4y1Q7e6/spm_id_from=333.788&vd_source=752a4cd440b20a1953dc8d254ef99696
https://www.bilibili.com/video/BV1iJ411E7xWp=135&vd_source=38cb30e60861b967d6cdfa51ce1c31fa

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

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

相关文章

云存储、云计算与分布式存储、分布式计算是一回事吗?

随着互联网的蓬勃兴起,大数据、人工智能、物联网、云计算与云存储等这些专业词汇在大众视野内出现的频率越来越高,再加上近几年分布式技术异军突起,更使得分布式存储、分布式计算等成为热词。然而,很多人对这些名词都一知半解&…

HTML5+CSS3(七)-全面详解(学习总结---从入门到深化)

目录 字体属性 color font-size font-weight font-style font-family 学习效果反馈 背景属性一 background-color属性 background-image属性 background-repeat属性 学习效果反馈 背景属性二 background-size属性 background-position属性 background-attachment属性…

Utools的安装与使用

Utools的安装与使用 新一代效率工具平台. 自由组合插件应用,打造专属你的趁手工具集,我们可以根据自己需求下载对应插件,然后通过Utools启动插件,不用向以前那样不同的插件需要找到对应插件地址。我们也可以通过设置全局快捷键快速…

ESP-IDF:字符串中字符转为链表结点入栈(使用STL stack),然后打印栈中内容

ESP-IDF:字符串中字符转为链表结点入栈(使用STL stack),然后打印栈中内容 /字符串中字符转为链表结点入栈(使用STL stack),然后打印栈中内容/ #include typedef struct LINKNODE20 { struct LINKNODE20 * next; }linknode20; typedef struct MYCHAR20 { linknode20 node; ch…

C++ STL源码剖析 笔记

写在前面 记录一下《C STL源码剖析》中的要点。 一、STL六大组件 容器(container): 各种数据结构,用于存放数据;class template 类泛型;如vector, list, deque, set, map; 算法(a…

LeetCode刷题系列 -- 113. 路径总和 II

给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。叶子节点 是指没有子节点的节点。示例 1:输入:root [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum 22输出&#x…

Java:函数与数组的相关代码题目

引言: 放松一段时间,今天又重新开始与大家来学习,假期正是我们反超别人的最佳时间,大家要抑制自己的情绪,低头学习。没有任何一种成功是短时间可以得到的,我们要做的就是,沉下心来&#xf…

偶数科技入选 IDC 中国分布式数据库报告,获 Innovator 殊荣

C Innovator 近日,全球知名咨询研究机构 IDC 发布了《中国分布式关系型数据库》研究报告,通过调研 CIO、IT 负责人、投资机构和众多厂商,评选出该领域综合表现突出的创新型厂商。偶数科技凭借其新一代云原生数据库 OushuDB 和实时湖仓一体创新…

rocketmq源码打包

背景:升级broker版本,并修改broker源代码步骤:1.下载源码,地址:https://rocketmq.apache.org/download/binary是编译好的可以直接使用,source是还没编译过的源代码,需要自行编译。因为我需要修改…

SpringMVC之Rest风格

目录 一:REST简介 二:RESTful入门案例 1.环境准备 三:思路分析 四:修改RESTful风格 五:RESTful快速开发 六:RESTful案例 1.需求分析 2. 环境准备 2 .后台接口开发 3.页面访问处理 步骤2:访问page…

java import javax.mail.*报错原因

今天在进行Javaweb项目开发导包时候出现问题。导入java import javax.mail.*进行报错在网上查询相关问题最后知道原因为:缺少收发邮件的jar包💡解决办法是下载相关jar包下载地址http://www.oracle.com/technetwork/java/javamail/javamail145-1904579.ht…

DS18B20测量温度数码管显示

DS18B20温度传感器简介DS18B20是一种数字温度传感器。它输出的是数字信号,同时具有体积小,硬件资源耗费少,抗干扰能力强,精度高等特点。DS18B20温度传感器特点1、单线接口:DS18B20仅需一条线可实现与微处理器双向通信。…

【C++】从0到1入门C++编程学习笔记 - 提高编程篇:STL常用容器(stack容器)

文章目录一、stack 基本概念二、stack 常用接口一、stack 基本概念 概念:stack是一种先进后出(First In Last Out,FILO)的数据结构,它只有一个出口 栈中只有顶端的元素才可以被外界使用,因此栈不允许有遍历行为 栈中进入数据称为 — 入栈 p…

openMMLab 2

本文是openmmlab AI实战营的第二次课程的笔记,以下是我比较关注的部分。在图像分类任务上,视觉基础模型的发展,最新的是convNeXt。convNeXt : 返璞归真,将Swin Transformer 的模型元素迁移到卷积网络中,性能反超Transf…

设计模式-行为型模式(二)

目录 6.行为型模式 6.5 状态模式 6.5.1 概述 6.5.2 结构 6.5.3 案例实现 6.5.4 优缺点 6.5.5 使用场景 6.6 观察者模式 6.6.1 概述 6.6.2 结构 6.6.3 案例实现 6.6.4 优缺点 6.6.5 使用场景 6.6.6 JDK中提供的实现 6.7 中介者模式 6.7.1 概述 6.7.2 结构 6.7.…

物联网网关最常用的边缘计算优势在哪里

物联网是继计算机、互联网与移动通信网之后信息技术产业的第三次发展浪潮。通信技术能够使物联网将感知到的信息在不同的终端之间进行高效传输和交换,实现信息资源的互通和共享,是物联网各种应用功能的关键支撑。 物联网网关的通讯技术有很多&#xff0c…

COMSOL仿真教程—激光烧蚀

本例使用二维模型,将来自激光的入射热通量模拟为金属表面上空间分布的热源,从而得到金属的烧蚀过程和瞬态温度分布。仿真思路方案设计思路建模过程思路激光烧蚀.pdf建模说明新建在新建界面里点击模型向导。在选择物理场树中选择 传热>固体传热 以及 数…

unity 网络同步 预表现(预测同步)

基于守望先锋ECS网络同步: 程序丨暴雪Tim Ford:《守望先锋》架构设计与网络同步 本文主要聊聊预测同步 首先FPS这类游戏东西肯定不会让服务器过分相信客户端,因为总有混蛋开挂,作为一款即使对战游戏,高性能的网络表…

ICMP与DHCP(包含DHCP的全局配置模式与接口配置模式)

目录 ICMP DHCP DHCP服务器端部署 左边的全局配置模式 右边的接口配置模式 ICMP ICMP:互联网消息控制协议,用来在网络设备间传递各种差错和控制信息,对于收集各种网络信息、诊断和排除各种网络故障等方面起着至关重要的作用。基于IP协议…

双线性插值法

文章目录前言一、双线性插值二、代码实现总结前言 在上一文《最近邻插值法》中我们讨论了最近邻,并且使用python实现,本章节中我们继续讨论图像缩放算法——双线性插值法,给难度升个级。 一、双线性插值 你在哪里见过下面这个图?回…