【计算机基本原理-数据结构】数据结构中树的详解

【计算机基本原理-数据结构】数据结构中树的详解

  • 1)总览
  • 2)树的相关概念
  • 3)二叉树、满二叉树、完全二叉树
  • 4)二叉查找树 - BST
  • 5)平衡二叉树 - AVL
  • 6)红黑树
  • 7)哈弗曼树
  • 8)B 树
  • 9)B+树
  • 10)R 树
  • 11)总结
  • 12)参考文章

1)总览

在这里插入图片描述
树是一种数据结构,它是 n(n>=0)个节点的有限集。n=0 时称为空树。n>0 时,有限集的元素构成一个具有层次感的数据结构。

在这里插入图片描述

区别于线性表一对一的元素关系,树中的节点是一对多的关系。树具有以下特点:n>0 时,根节点是唯一的,不可能存在多个根节点。每个节点有零个至多个子节点;除了根节点外,每个节点有且仅有一个父节点。根节点没有父节点。

2)树的相关概念

树有许多相关的术语与概念,在学习树的结构之前,我们要熟悉这些概念。

  • 子树除了根节点外,每个子节点都可以分为多个不相交的子树。

  • 孩子与双亲若一个结点有子树,那么该结点称为子树根的"双亲",子树的根是该结点的"孩子"。在图一中,B、H 是 A 的孩子,A 是 B、H 的双亲。

  • 兄弟具有相同双亲的节点互为兄弟,例如 B 与 H 互为兄弟。

  • 节点的度一个节点拥有子树的数目。例如 A 的度为 2,B 的度为 1,C 的度为 3。

  • 叶子没有子树,也即是度为 0 的节点。分支节点: 除了叶子节点之外的节点,也即是度不为 0 的节点。

  • 内部节点除了根节点之外的分支节点。

  • 层次根节点为第一层,其余节点的层次等于其双亲节点的层次加 1。

  • 树的高度也称为树的深度,树中节点的最大层次。

  • 有序树树中节点各子树之间的次序是重要的,不可以随意交换位置。

  • 无序树: 树种节点各子树之间的次序是不重要的。可以随意交换位置。

  • 森林: 0 或多棵互不相交的树的集合。例如图二中的两棵树为森林。

3)二叉树、满二叉树、完全二叉树

  • 二叉树最多有两棵子树的树被称为二叉树

在这里插入图片描述

  • 斜树所有节点都只有左子树的二叉树叫做左斜树,所有节点都只有右子树的二叉树叫做右斜树。(本质就是链表)

在这里插入图片描述

  • 满二叉树二叉树中所有非叶子结点的度都是2,且叶子结点都在同一层次上

在这里插入图片描述

  • 完全二叉树如果一个二叉树与满二叉树前m个节点的结构相同,这样的二叉树被称为完全二叉树

在这里插入图片描述

4)二叉查找树 - BST

二叉查找树(Binary Search Tree)是指一棵空树或者具有下列性质的二叉树:

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

2、若任意节点的右子树不空,则右子树上所有节点的值均大于它的根节点的值。

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

4、没有键值相等的节点。

二叉查找树相比于其他数据结构的优势在于查找、插入的时间复杂度较低为 O ( log ⁡ n ) 。二叉查找树是基础性数据结构,用于构建更为抽象的数据结构,如集合、多重集、关联数组等。

在这里插入图片描述

5)平衡二叉树 - AVL

含有相同节点的二叉查找树可以有不同的形态,而二叉查找树的平均查找长度与树的深度有关,所以需要找出一个查找平均长度最小的一棵,那就是平衡二叉树,具有以下性质:

1、要么是棵空树,要么其根节点左右子树的深度之差的绝对值不超过 1。

2、其左右子树也都是平衡二叉树。

3、二叉树节点的平衡因子定义为该节点的左子树的深度减去右子树的深度。则平衡二叉树的所有节点的平衡因子只可能是 -1,0,1。

在这里插入图片描述

6)红黑树

红黑树也是一种自平衡的二叉查找树。

1、每个结点要么是红的要么是黑的。(红或黑)

2、根结点是黑的。(根黑)

3、每个叶结点(叶结点即指树尾端NIL指针或NULL结点)都是黑的。(叶黑)

4、如果一个结点是红的,那么它的两个儿子都是黑的。 (红子黑)

5、对于任意结点而言,其到叶结点树尾端NIL指针的每条路径都包含相同数目的黑结点。(路径下黑相同)

在这里插入图片描述

用法最广:

  • Java Concurrent HashMap & TreeMap

  • C++ STL:map & set

  • Linux 进程调度 Completely Fair Scheduler,用红黑树管理进程控制块

  • epoll 在内核中的实现,用红黑树管理事件块

  • nginx 中,用红黑树管理timer等

7)哈弗曼树

哈夫曼又称最优二叉树。是一种带权路径长度最短的二叉树,一般可以按下面步骤构建:

1、将所有左,右子树都为空的作为根节点。

2、在森林中选出两棵根节点的权值最小的树作为一棵新树的左,右子树,且置新树的附加根节点的权值为其左,右子树上根节点的权值之和。注意,左子树的权值应小于右子树的权值。

3、从森林中删除这两棵树,同时把新树加入到森林中。

4、重复2,3步骤,直到森林中只有一棵树为止,此树便是哈夫曼树。

在这里插入图片描述

8)B 树

B 树(英语: B-tree)是一种自平衡的树,能够保持数据有序。这种数据结构能够让查找数据、顺序访问、插入数据及删除的动作,都在对数时间内完成。B 树,概括来说是一种自平衡的 m 阶树,与自平衡二叉查找树不同,B 树适用于读写相对大的数据块的存储系统,例如磁盘。

1、根结点至少有两个子女。

2、每个中间节点都包含 k-1 个元素和 k 个孩子,其中 m/2 <= k <= m。

3、每一个叶子节点都包含 k-1 个元素,其中 m/2 <= k <= m。

4、所有的叶子结点都位于同一层。

5、每个节点中的元素从小到大排列,节点当中 k-1 个元素正好是k个孩子包含的元素的值域分划。

B - Tree 中的每个节点根据实际情况可以包含大量的关键字信息和分支,如下图所示为一个 3 阶的 B - Tree:

在这里插入图片描述

9)B+树

B + 树是一种树数据结构,通常用于关系型数据库(如Mysql)和操作系统的文件系统中。

1、B + 树的特点是能够保持数据稳定有序,其插入与修改拥有较稳定的对数时间复杂度。

2、B + 树元素自底向上插入,这与二叉树恰好相反。

3、在 B 树基础上,为叶子结点增加链表指针(B + 树叶子有序链表),所有关键字都在叶子结点中出现,非叶子结点作为叶子结点的索引;B + 树总是到叶子结点才命中。

4、B + 树的非叶子节点不保存数据,只保存子树的临界值(最大或者最小),所以同样大小的节点,B + 树相对于 B 树能够有更多的分支,使得这棵树更加矮胖,查询时做的 IO 操作次数也更少。

将上一节中的 B - Tree 优化,由于 B + Tree 的非叶子节点只存储键值信息,假设每个磁盘块能存储 4 个键值及指针信息,则变成 B + Tree 后其结构如下图所示:

在这里插入图片描述)

10)R 树

R 树是用来做空间数据存储的树状数据结构。例如给地理位置,矩形和多边形这类多维数据建立索引。

R 树的核心思想是聚合距离相近的节点并在树结构的上一层将其表示为这些节点的最小外接矩形(MBR),这个最小外接矩形就成为上一层的一个节点。因为所有节点都在它们的最小外接矩形中,所以跟某个矩形不相交的查询就一定跟这个矩形中的所有节点都不相交。叶子节点上的每个矩形都代表一个对象,节点都是对象的聚合,并且越往上层聚合的对象就越多。也可以把每一层看做是对数据集的近似,叶子节点层是最细粒度的近似,与数据集相似度 100%,越往上层越粗糙。

在这里插入图片描述

11)总结

我们知道,实际应用当中,我们经常使用的是查找和排序操作,这在我们的各种管理系统、数据库系统、操作系统等当中,十分常用。

数组:数组的下标寻址十分迅速,但计算机的内存是有限的,故数组的长度也是有限的,实际应用当中的数据往往十分庞大;而且无序数组的查找最坏情况需要遍历整个数组;后来人们提出了二分查找,二分查找要求数组的构造一定有序,二分法查找解决了普通数组查找复杂度过高的问题。任何一种数组无法解决的问题就是插入、删除操作比较复杂,因此,在一个增删查改比较频繁的数据结构中,数组不会被优先考虑。

普通链表由于链表的结构特点被证明根本不适合进行查找。

哈希表哈希表是数组和链表的折中,同时它的设计依赖散列函数的设计,数组不能无限长、链表也不适合查找,所以也不适合大规模的查找

二叉查找树二叉查找树可能退化成链表,同样不适合进行查找

AVL 树:AVL树是为了解决可能退化成链表问题,但是 AVL 树的旋转过程非常麻烦,因此插入和删除很慢,也就是构建AVL树比较麻烦。

红黑树红黑树是平衡二叉树和AVL树的折中,因此是比较合适的。集合类中的Map、关联数组具有较高的查询效率,它们的底层实现就是红黑树。

多路查找树:大规模数据存储中,实现索引查询这样一个实际背景下,树节点存储的元素数量是有限的(如果元素数量非常多的话,查找就退化成节点内部的线性查找了),这样导致二叉查找树结构由于树的深度过大而造成磁盘 I/O 读写过于频繁,进而导致查询效率低下。

B 树:与自平衡二叉查找树不同,B 树适用于读写相对大的数据块的存储系统,例如磁盘。它的应用是文件系统及部分非关系型数据库索引。

B + 树在 B 树基础上,为叶子结点增加链表指针(B + 树叶子有序链表),所有关键字都在叶子结点中出现,非叶子结点作为叶子结点的索引;B + 树总是到叶子结点才命中。通常用于关系型数据库(如 Mysql)和操作系统的文件系统中。

B * 树:是 B + 树的变体,在 B + 树的非根和非叶子结点再增加指向兄弟的指针, 在 B + 树基础上,为非叶子结点也增加链表指针,将结点的最低利用率从 1/2 提高到 2/3。

R 树是用来做空间数据存储的树状数据结构。例如给地理位置,矩形和多边形这类多维数据建立索引。

Trie 树:Trie 树是自然语言处理中最常用的数据结构,很多字符串处理任务都会用到。Trie 树本身是一种有限状态自动机,还有很多变体。什么模式匹配、正则表达式,都与这有关。

针对大量数据,如果在内存中作业优先考虑红黑树(map,set 之类多为 RB-tree 实现),如果在硬盘中作业优先考虑 B 系列树(B +,B,B *)

12)参考文章

  • 各种二叉树的介绍

  • 二叉树、二叉搜索树、平衡二叉树、B树、B+树的精确定义和区别探究

  • 数据结构之树

  • B + Tree原理及 Mysql 的索引分析

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

TCP流量控制与拥塞控制

什么是流量控制 一条TCP连接的每一侧主机都为该连接设置了接收缓存。当该TCP连接接收到正确的、有序的报文段&#xff0c;就会将数据放入接收缓存。相关联的应用会从缓存中读取数据。 如果发送者发送数据过快、过多&#xff0c;而接收方的应用程序从缓冲区读取的速度较慢&…

机器学习实战教程(十):逻辑回归

概述 逻辑回归&#xff08;Logistic Regression&#xff09;是一种用于解决二分类或多分类问题的统计学习方法。它以自变量线性组合的形式进行建模&#xff0c;并使用Sigmoid函数将结果映射到[0, 1]的值域内&#xff0c;表示样本属于某个类别的概率。 Logistic Regression是最…

Stable Diffusion-生式AI的新范式

! 扩散模型&#xff08;Stable Diffusion)现在是生成图像的首选模型。由于扩散模型允许我们以提示( prompts)为条件生成图像&#xff0c;我们可以生成我们所选择的图像。在这些文本条件的扩散模型中&#xff0c;稳定扩散模型由于其开源性而最为著名。 在这篇文章中&#xff0…

STM32平衡小车 TB6612电机驱动学习

TB6612FNG简介 单片机引脚的电流一般只有几十个毫安&#xff0c;无法驱动电机&#xff0c;因此一般是通过单片机控制电机驱动芯片进而控制电机。TB6612是比较常用的电机驱动芯片之一。 TB6612FNG可以同时控制两个电机&#xff0c;工作电流1.2A&#xff0c;最大电流3.2A。 VM电…

力劲塑机:用CRM“塑造”数字化能力

你知道吗&#xff1f;从手机到电脑&#xff0c;从暖气到扶梯&#xff0c;从家用电器到汽车、摩托车&#xff0c;从眼镜、手表到拉链、纽扣&#xff0c;这些物品的生产过程都离不开压铸和注塑工艺。如果说压铸和注塑这个几百亿的产业带动了几万亿的市场&#xff0c;一点也不夸张…

fc坦克大战游戏完美复刻

文章目录 一、 介绍二、 制作基本物体三、 控制玩家坦克移动、转向四、 子弹脚本、爆炸脚本五、 敌人AI寻路算法六、 坦克生成点脚本七、 用链表实例化地图八、 玩家游戏控制器脚本九、 添加音效十、 资源包 一、 介绍 儿时经典游戏《坦克大战》完整复刻 发射子弹、生成敌人、…

巧用千寻位置GNSS软件|一文教会横断面测量

测横断面主要用于线路工程和水利工程的前期设计中&#xff0c;在线路平曲线设计好之后&#xff0c;千寻位置GNSS软件可用于在中桩处测定垂直于线路中线方向原地貌的地面起伏的数据&#xff0c;本期就为大家介绍具体的操作技巧。 点击【测量】->【测横断面】&#xff0c;选择…

java——最小的K个数

题目链接 牛客在线oj题——最小的K个数 题目描述 给定一个长度为 n 的可能有重复值的数组&#xff0c;找出其中不去重的最小的 k 个数。例如数组元素是4,5,1,6,2,7,3,8这8个数字&#xff0c;则最小的4个数字是1,2,3,4(任意顺序皆可)。 数据范围&#xff1a;0≤k,n≤10000&…

Flink之TaskManager内存解析

一、CK失败 Flink任务的checkpoint操作失败大致分为两种情况&#xff0c;ck decline和ck expire: &#xff08;1&#xff09;ck decline 发生ck decline情况时&#xff0c;我们可以通过查看JobManager.log或TaskManager.log查明具体原因。其中有一种特殊情况为ck cancel&…

idea使用 ( 二 ) 创建java项目

3.创建java项目 3.1.创建普通java项目 3.1.1.打开创建向导 接 2.3.1.创建新的项目 也可以 从菜单选择建立项目 会打开下面的选择界面 3.1.2.不使用模板 3.1.3.设置项目名 Project name : 项目名 Project location : 项目存放的位置 确认创建 3.1.4.关闭tips 将 Dont s…

增强型PID-自适应-前馈-神经网络控制研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

解决docker启动mysql无法输入中文以及中文不显示或乱码问题

前言 我在使用MySQL时&#xff0c;遇到了两个问题。一是在插入中文数据时&#xff0c;无法输入中文。二是在select的时候&#xff0c;查出来的中文数据是空的&#xff08;因为插入时为空&#xff09;&#xff0c;然后我就使用Navicat连接数据库添加了中文数据&#xff0c;再到…

搭建家庭影音媒体中心 --公网远程连接Jellyfin流媒体服务器

文章目录 前言1. 安装Home Assistant2. 配置Home Assistant3. 安装cpolar内网穿透3.1 windows系统3.2 Linux系统3.3 macOS系统 4. 映射Home Assistant端口5. 公网访问Home Assistant6. 固定公网地址6.1 保留一个固定二级子域名6.2 配置固定二级子域名 转载自远程穿透的文章&…

人工智能时代来临,殊不知低代码早已出手

科普一下人工智能的等级划分&#xff0c;按照实力&#xff0c;人工智能可以分为弱人工智能(Artificial Narrow Intelligence&#xff0c;简称ANI)、强人工智能(Artificial General Intelligence简称AGI)、超人工智能(Artificial Superintelligence简称ASI)三个等级。 弱人工智能…

JavaWeb学习------Servlet

目录 JavaWeb学习------Servlet Servlet 生命周期 Servlet 生命周期 Servlet 方法介绍 •Servlet 体系结构 Servlet 体系结构 •Servlet urlPattern配置 Servlet urlPattern配置 •XML 配置方式编写 Servlet XML 配置方式编写 Servlet JavaWeb学习------Servlet •快速…

【汽车品牌案例02-设置右侧索引 Objective-C语言】

一、刚才我们说了一下,如何把那个汽车品牌加载起来,我们使用了一个模型的嵌套,以及我们在创建单元格的时候,是不是指定了一个,单元格的可重用ID吧, 1.根据重用ID来创建单元格,那么我们运行的时候,已经能把这个大致的效果做出来了, 大致就是这么一个效果, 接下来,还…

【剧前爆米花--爪哇岛寻宝】网络互连,网络通信和网络分层

作者&#xff1a;困了电视剧 专栏&#xff1a;《JavaEE初阶》 文章分布&#xff1a;这是一篇关于网络初识的文章&#xff0c;在这篇文章中讲解了局域网广域网&#xff0c;IP地址&#xff0c;端口以及网络分层等相关内容&#xff0c;希望对你有所帮助&#xff01; 目录 网络互连…

PyTorch中的交叉熵函数 CrossEntropyLoss的计算过程

CrossEntropyLoss() 函数联合调用了 nn.LogSoftmax() 和 nn.NLLLoss()。 关于交叉熵函数的公式详见&#xff1a; 交叉熵损失函数原理详解 CrossEntropyLoss() 函数的计算过程可以拆解为如下四个步骤&#xff1a; 1、对输出的结果进行softmax操作,因为softmax操作可以将所有输入…

基于虚拟同步发电机的光伏混合储能并网系统MATLAB仿真

资源地址&#xff1a; 主要模块&#xff1a; 光伏电池模型&#xff08;按照数学模型搭建&#xff09;、蓄电池储能模块、超级电容储能模块、双向DC/DC模块、LC滤波器、逆变器VSG控制模块电压电流双环控制模块、光伏MPPT控制模块、储能系统充放电控制模块。 使用MATLAB2021b及…

09-Node.js—express框架

目录 1、express 介绍2、express 使用2.1 express 下载2.2 express 初体验 3、express 路由3.1 什么是路由3.2 路由的使用3.2.1使用Ajax发送一次post请求 3.3 获取请求参数 3.4 获取路由参数3.5 路由参数练习 4、express 响应设置5、express 中间件5.1 什么是中间件5.2 中间件的…