什么是树(Tree),数据结构中一般有哪些树?

彻底理解堆 文章目录什么是堆如何在给定数组上创建堆增加堆节点以及删除堆节点删除节点增加节点堆的应用排序求最大(最小)的K个数定时器是如何实现的总结 什么是堆 在计算机科学中堆是一种很有趣的数据结构,实际上通常用数组来存储堆中的元素,但是我们却可以把数组中元素视为树,如图所示: 这就是一个普通的数组,但是我们可以将其看做如下图所示的树: 这是怎么做到的呢? 原来虽然我们是在数组中存储的堆元素,但是这里面有一... 阅读详情

树(Tree)的基本概念
树是由结点或顶点和边组成的(可能是非线性的)且不存在着任何环的一种数据结构。没有结点的树称为空(null或empty)树。一棵非空的树包括一个根结点,还(很可能)有多个附加结点,所有结点构成一个多级分层结构。

二叉树

每个结点至多拥有两棵子树(即二叉树中不存在度大于2的结点),并且,二叉树的子树有左右之分,其次序不能任意颠倒。

二叉树的性质

  1. 若二叉树的层次从0开始,则在二叉树的第i层至多有2^i个结点(i>=0)
  2. 高度为k的二叉树最多有2^(k+1) - 1个结点(k>=-1)(空树的高度为-1)
  3. 对任何一棵二叉树,如果其叶子结点(度为0)数为m, 度为2的结点数为n, 则m = n + 1

二叉树又分为:完美二叉树,完全二叉树,完满二叉树

完美二叉树(满二叉树)

img

完全二叉树

img

完满二叉树

img

区别

img

二叉树的遍历方法

中序遍历:即左-根-右遍历,对于给定的二叉树根,寻找其左子树;对于其左子树的根,再去寻找其左子树;递归遍历,直到寻找最左边的节点i,其必然为叶子,然后遍历i的父节点,再遍历i的兄弟节点。随着递归的逐渐出栈,最终完成遍历

先序遍历:即根-左-右遍历

后序遍历:即左-右-根遍历

在Java中常见的树结构

二叉查找树

二叉查找树也称为有序二叉查找树,满足二叉查找树的一般性质,是指一棵空树

具有如下性质:

  1. 任意节点左子树不为空,则左子树的值均小于根节点的值

  2. 任意节点右子树不为空,则右子树的值均大于于根节点的值

  3. 任意节点的左右子树也分别是二叉查找树 没有键值相等的节点

局限性及应用
一个二叉查找树是由n个节点随机构成,所以,对于某些情况,二叉查找树会退化成一个有n个节点的线性链.如下图:

img

AVL树

AVL树是带有平衡条件的二叉查找树,和红黑树相比,它是严格的平衡二叉树,平衡条件必须满足(所有节点的左右子树高度差不超过1).不管我们是执行插入还是删除操作,只要不满足上面的条件,就要通过旋转来保持平衡,而旋转是非常耗时的

使用场景:

AVL树适合用于插入删除次数比较少,但查找多的情况。 也在Windows进程地址空间管理中得到了使用 旋转的目的是为了降低树的高度,使其平衡

AVL树特点: AVL树是一棵二叉搜索树 AVL树的左右子节点也是AVL树 AVL树拥有二叉搜索树的所有基本特点 每个节点的左右子节点的高度之差的绝对值最多为1,即平衡因子为范围为[-1,1]

红黑树

一种自平衡二叉查找树, 通过对任何一条从根到叶子的路径上各个节点着色的方式的限制,红黑树确保从根到叶子节点的最长路径不会是最短路径的两倍,用非严格的平衡来换取增删节点时候旋转次数的降低,任何不平衡都会在三次旋转之内解决

使用场景:

红黑树多用于搜索,插入,删除操作多的情况下

红黑树应用比较广泛:

  1. 广泛用在C++的STL中。map和set都是用红黑树实现的。
  2. 著名的linux进程调度Completely Fair Scheduler,用红黑树管理进程控制块。
  3. epoll在内核中的实现,用红黑树管理事件块
  4. nginx中,用红黑树管理timer等

原因: 红黑树的查询性能略微逊色于AVL树,因为比AVL树会稍微不平衡最多一层,也就是说红黑树的查询性能只比相同内容的AVL树最多多一次比较,但是,红黑树在插入和删除上完爆AVL树,AVL树每次插入删除会进行大量的平衡度计算,而红黑树为了维持红黑性质所做的红黑变换和旋转的开销,相较于AVL树为了维持平衡的开销要小得多

性质:

  1. 节点是红色或黑色。
  2. 根节点是黑色。
  3. 每个叶子节点都是黑色的空节点(NIL节点)。
  4. 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)
  5. 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。

B树

B-树就是B树,-只是一个符号.

B树(B-Tree)是一种自平衡的树,它是一种多路搜索树(并不是二叉的),能够保证数据有序。同时它还保证了在查找、插入、删除等操作时性能都能保持在O(logn),为大块数据的读写操作做了优化,同时它也可以用来描述外部存储(支持对保存在磁盘或者网络上的符号表进行外部查找)

特点:

  1. 定义任意非叶子结点最多只有M个儿子;且M>2
  2. 根结点的儿子数为[2, M]
  3. 除根结点以外的非叶子结点的儿子数为[M/2, M]
  4. 每个结点存放至少M/2-1(取上整)和至多M-1个关键字;(至少2个关键字)
  5. 非叶子结点的关键字个数=指向儿子的指针个数-1
  6. 非叶子结点的关键字:K[1], K[2], …, K[M-1];且K[i] < K[i+1]
  7. 非叶子结点的指针:P[1], P[2], …, P[M],其中P[1]指向关键字小于K[1]的子树,P[M]指向关键字大于K[M-1]的子树,其它P[i]指向关键字属于(K[i-1], K[i])的子树
  8. 所有叶子结点位于同一层

如:(M=3)

img

插入与平衡过程

这个图用以表示往 4 阶 B 树中依次插入下面这组数据的过程:
6 10 4 14 5 11 15 3 2 12 1 7 8 8 6 3 6 21 5 15 15 6 32 23 45 65 7 8 6 5 4

4 阶 B 树表示每个节点最多有 4 个子树、3 个关键字,最少有 2 个子树、一个关键字

添加/删除也是一样的,要考虑添加/删除孩子后,父节点是否还满足子树 k 介于 M/2 和 M 的条件,不满足就得从别的节点拆子树甚至修改相关子树结构来保持平衡。

B+树

B+树是B-树的变体,也是一种多路搜索树
B+的搜索与B-树也基本相同,区别是B+树只有达到叶子结点才命中(B-树可以在非叶子结点命中),其性能也等价于在关键字全集做一次二分查找;

B+的特性:

  1. 所有关键字都出现在叶子结点的链表中(稠密索引),且链表中的关键字恰好是有序的
  2. 不可能在非叶子结点命中
  3. 非叶子结点相当于是叶子结点的索引(稀疏索引),叶子结点相当于是存储(关键字)数据的数据层
  4. 更适合文件索引系统

原因: 增删文件(节点)时,效率更高,因为B+树的叶子节点包含所有关键字,并以有序的链表结构存储,这样可很好提高增删效率
如:(M=3)

img

使用场景:

文件系统和数据库系统中常用的B/B+ 树,他通过对每个节点存储个数的扩展,使得对连续的数据能够进行较快的定位和访问,能够有效减少查找时间,提高存储的空间局部性从而减少IO操作。

他广泛用于文件系统及数据库中,如:
Windows:HPFS 文件系统
Mac:HFS,HFS+ 文件系统
Linux:ResiserFS,XFS,Ext3FS,JFS 文件系统
数据库:ORACLE,MYSQL,SQLSERVER 等中

B树:有序数组+平衡多叉树 B+树:有序数组链表+平衡多叉树

B+ 树的优点:

  1. 层级更低,IO 次数更少
  2. 每次都需要查询到叶子节点,查询性能稳定
  3. 叶子节点形成有序链表,范围查询方便

B+树还有一个最大的好处,方便扫库,B树必须用中序遍历的方法按序扫库,而B+树直接从叶子结点挨个扫一遍就完了,B+树支持range-query非常方便,而B树不支持。这是数据库选用B+树的最主要原因。

比如要查 5-10之间的,B+树一把到5这个标记,再一把到10,然后串起来就行了,B树就非常麻烦。B树的好处,就是成功查询特别有利,因为树的高度总体要比B+树矮。不成功的情况下,B树也比B+树稍稍占一点点便宜。

参考:

常用数据结构——树 - 简书(介绍向)

数据结构(十三)——树-生命不息,奋斗不止-51CTO博客(代码向)

Pytorch 叶子节点和非叶子节点的理解 PS:注意这里的描述“非叶子节点的梯度会被释放掉”。这其实暗含了非叶子节点必须是要参与梯度计算的,也就是requires_grad=True,同时也意味着requires_grad=False的节点一定是叶子节点,因为这样的tensor压根不参与求导,也没梯度,自然不需要“释放掉梯度”。这就成为了判别叶子节点和非叶子节点的第一个标准,见下。叶子节点是用户创建的节点,不依赖其它节点;它们表现出来的区别在于反向传播结束之后,非叶子节点的梯度会被释放掉,只保留叶子节点的梯度,这样就节省了内存。 阅读详情

相关推荐

球树(ball-tree)及基于球树的 knn 详解

本文介绍了在使用kd树执行knn的短板,并引出了球树(ball-tree)的概念、构造过程以及基于球树的knn算法。文中包含文字描述、算法实例图解,以及算法伪代码框架。

Called_North的博客 3646

B树相关

B树 即二叉搜索树: 1.所有非叶子结点至多拥有两个儿子(Left和Right); 2.所有结点存储一个关键字; 3.非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树; 如: B树的搜索,从根结点开始,如果查询的关键字与结点的关键字相等,那么就命中;否则,如果查询关键字比结点关键字小,就进入左儿子;如果比结点关键字大,就进入右儿子;如果...

Galaxy_songypd的博客 1276

【数据结构基础】树 - 前缀树(Trie Tree)

在计算机科学中,trie,又称前缀树或字典树,是一种有序树,用于保存关联数组,其中的键通常是字符串。与二叉查找树不同,键不是直接保存在节点中,而是由节点在树中的位置决定。一个节点的所有子孙都有相同的前缀,也就是这个节点对应的字符串,而根节点对应空字符串。一般情况下,不是所有的节点都有对应的值,只有叶子节点和部分内部节点所对应的键才有相关的值。Trie 这个术语来自于 retrieval。根据词源学,trie 的发明者 Edward Fredkin 把它读作/ˈtriː/ “tree”。

DeveloperFire的博客 5503

第五章 树和二叉树(理论)

5.1树和二叉树的定义 5.5线索二叉树

qq_42453930的博客 2029

Python数据结构之树(Tree)

本文介绍了Python中树(Tree)数据结构的基本概念和常见类型,重点讲解了二叉树和平衡二叉树的实现与应用。内容包括树的基本术语(节点、根节点、叶子节点等)、二叉搜索树(BST)的特点与操作(查找、插入、删除)、树的遍历算法(前序、中序、后序)以及代码实现。此外还详细介绍了平衡二叉树的性质、旋转操作及其在数据库索引等场景的应用,并提供了AVL树的Python实现代码。文章适合需要掌握树结构基础和算法实现的Python开发者。

weixin_50877427的博客 1267

spoon工具的常用基础操作

先创建一个作业,这个作业流程,包括进行设置变量转换,查询结果输出转换,方便后续循环。整个流程写完后,执行作业5_执行整个流程,成功后,可以在数据库查看结果。,新建一个转换,excel表输入然后复制记录到结果,保存转换文件。这三个用户下 都有一张emp表 分别是 三个部门的用户信息。,新建一个数据库连接,变量命名用户名和密码。成功执行后,可以到保存的excel位置进行查看。emp表输入,可以进行预览查看数据有没有过来。输出到一直excel表,运行结果输出。,新建一个转换,拖拽。

qq_43583887的博客 5831

树

一、关于树的几个基本概念 结点:一个数据元素及若干指向其子树的分支 结点的度:结点所拥有的子树的个数称为该结点的度 树的度:树中个结点的度的最大值称为该树的度 叶子结点:度为0的结点称为叶子结点 非叶子结点:度不为0的结点称为非叶子结点(分支结点)。根结点外的分支结点又称内部结点。 孩子结点:一个结点的子树的根 双亲结点\父结点 兄弟结点:拥有同一父结点的所有结点 层次:

Jason__sz的博客 1344

避坑指南:RFSoC数据转换器多片同步配置的7个致命错误

本文深入剖析了在配置RFSoC多片同步功能时,工程师最常遇到的七个致命错误。从Tile 0的强制启用、时钟域与SYSREF时序,到跨代器件兼容性、电源序列以及动态重配置的陷阱,文章结合实战经验,提供了从原理到调试的完整RF数据转换器配置指南,旨在帮助开发者高效构建相位一致的大规模射频采样系统。

weixin_28452161的博客 533

数据结构:树(Tree)【详解】

树 一、知识框架 二、考纲内容 树的基本概念 二叉树 二叉树的定义及其主要特征;二叉树的顺序存储结构和链式存储结构;二叉树的遍历;线索二叉树的基本概念和构造 树、森林 树的存储结构;森林与二叉树的转换;树和森林的遍历 树与二叉树的应用 二叉排序树;平衡二叉树;哈夫曼树和哈弗编码 三、树的基本概念 1、树的定义 树是n(n>=0)个结点的有限集。当n = 0时,称为空树。在任意一棵非空树中应满足: 有且仅有一个特定的称为根的结点。 当n>1时,其余节点可分为m(m>

UniqueUnit的博客 23万+

深入解析Unity3D中PostLateUpdate突然占用大量时间的原因

在Unity3D的生命周期中,是一个在LateUpdate之后被调用的方法。它通常用于处理一些需要在所有更新(包括物理更新和动画更新)之后进行的逻辑。由于它在游戏循环的后期阶段被调用,因此它通常用于处理与渲染直接相关的任务,如相机调整、UI更新等。突然占用大量时间的问题可能由多种原因引起,包括复杂的逻辑处理、频繁的资源加载、不恰当的渲染优化、插件或第三方库的副作用以及内存泄漏或垃圾回收等。为了解决这个问题,开发者需要仔细审查和优化中的代码,同时利用Unity提供的工具来监控和分析游戏性能。

Yori_22的博客 979

药物不良反应预测实战指南:从FAERS数据挖掘到PyTorch深度学习模型(含可解释性分析)

【代码】药物不良反应预测实战指南:从FAERS数据挖掘到PyTorch深度学习模型(含可解释性分析)

理论都是虚的,代码才是王道。 721

Tree | 一般树 —— 概念、建立与凹进输出

目录 一、树的基本概念 1、树的结构: 2、树一些名词解释: 二、一般树的实现 1、树的结构 2、树的建立 3、树的输出 打印某个节点的函数如下: 整个树的打印递归实现: End 一、树的基本概念 树是一种数据结构,由n(n>=0)个有限结点组成一个有层次关系的集合。 由于形状像一颗倒立的树而得名。 当n=0时称为空树,非空树的特征如下: (1...

weixin_43787043的博客 2133

Java炫酷烟花③(完整代码)

Java语言实现炫酷烟花动画的完整代码。 下载代码 下载链接:我是一只有趣的兔子,感谢你的喜欢。

AIGC 784

BFS,DFS,以及图(Graph),树(Tree)的思考

最近刷leetcode发现了很多题有使用到树,图,dfs和bfs,回想当时在离散数学,图论,还有数据结构的课上都有讨论过这方面的问题,于是就想尽自己的力去总结一份文档分享出来,也方便自己需要的时候查阅。个人理解可能并不准确,如有问题请联系修改。 这里做个目录吧: 1.图论中图的基础定义: BFS,DFS,以及图(Graph),树(Tree)的思考(1)_PigeonEssence的博客-优快云博客我们在算法题以及很多算法理论中,经常会讨论到DFS和BFS算...

PigeonEssence的博客 1万+

基于Simulink的固态变压器(SST)多级协同控制

本文基于Simulink平台,详细介绍了固态变压器(SST)多级协同控制的建模与仿真方法。针对SST三级架构(AC-DC、DC-DC、DC-AC)存在的级间耦合问题,提出了纵向解耦与横向联动的协同控制策略。通过搭建10kV/400V级联型SST系统模型,实现了输入电压波动±20%或负载0-100%跳变时直流母线电压波动小于2%的控制目标。文章详细讲解了Simulink建模步骤、控制算法推导及工程部署建议,包括功率前馈控制、虚拟惯性算法等关键技术。仿真结果表明,该协同控制方案能有效抑制负载突变时的电压波动,为

MHD0815的博客 214

Linux内核配置选项详解及编译过程

在内核编译完成后,可以通过重启系统并选择新编译的内核来使用它。可以在该菜单下选择需要编译进内核的设备驱动,也可以选择将设备驱动编译为模块。可以在该菜单下选择需要编译进内核的设备驱动,也可以选择将设备驱动编译为模块。可以选择需要的调试选项,并根据需要启用或禁用相应的功能。可以选择需要的文件系统类型,并根据需要启用或禁用相应的选项。可以选择需要的网络协议和功能,并根据需要启用或禁用相应的选项。可以选择需要的调试选项,并根据需要启用或禁用相应的功能。可以选择需要的文件系统类型,并根据需要启用或禁用相应的选项。

TechGlide的博客 747

数据结构(AVL树、B-Tree、B+Tree)

B-Tree(Balanced Tree),即B树,是一种自平衡的树形数据结构,专为磁盘和其他直接访问的辅助存储设备而设计,广泛应用于数据库和文件系统中。AVL树是一种自平衡的二叉搜索树,它的特点是每个节点的左子树和右子树的高度差(平衡因子)的绝对值不超过1。综上所述,B-Tree是一种高效的数据结构,通过保持树的平衡性和有序性,支持高效的查找、插入和删除操作。综上所述,B+Tree的原理基于其特殊的数据结构和高效的查找、插入、删除操作。B+Tree的原理主要基于其数据结构和查找、插入、删除等操作的特点。

cuishujian_2003的博客 1820

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

数据结构---树(Tree)

在数据结构中,是一种层次结构的数据结构,由节点(node)组成,其中每个节点通过边(edge)与其他节点连接。树是一种非线性的数据结构,广泛用于表示具有层级关系的数据。常见的树包括二叉树、平衡树、红黑树、B树等。:树中的基本元素,包含数据和指向子节点的指针(或引用)。:连接树中两个节点的连接线。:树的顶层节点,没有父节点。:某个节点的下级节点。:某个节点的上级节点。:没有子节点的节点。:树中某个节点到根节点的路径长度。:树中某个节点到其最深叶节点的最长路径长度。:树的某个节点及其所有后代节点构成的树。

weixin_44929475的博客 3698

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

C++数据结构之:树Tree

it人员无论是使用哪种高级语言开发东东,想要更高效有层次的开发程序的话都躲不开三件套:数据结构,算法和设计模式。数据结构是相互之间存在一种或多种特定关系的数据元素的集合,即带“结构”的数据元素的集合,“结构”就是指数据元素之间存在的关系,分为逻辑结构和存储结构。此系列专注讲解数据结构数组、链表、队列、栈、树、哈希表、图,通过介绍概念以及提及一些可能适用的场景,并以C++代码简易实现,多方面认识数据结构,最后为避免重复造轮子会浅提对应的STL容器。本文介绍的是树Tree。

weixin_45068267的博客 1158

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

索引数据结构之哈希、红黑树(Red Black Tree)、B树(B-Tree)、B+树详解

1、索引的本质:索引是帮助MySQL高效获取数据的排好序的数据结构 2、可以做索引结构: (1)数组,依赖下标。 (2)链表 (3)哈希 (4)二叉树 (5)B树 (6)B+树 3、MySQL的索引为啥是B+Tree?  答题线路:全部遍历→Hash→二叉树→平衡二叉树→B-Tree→B+Tree 零、全部遍历(没有索引) 从头到尾扫描,根据实践经验,如果数据规模在2千条以下,可以直接查找,时间也是很快的,毕竟数据规模小。但是随着规模的扩大,是一定要建立索引,提高查找效率。比如没有目录的牛津字典,那查找起

诗酒趁年华 2545

[C++] 数据结构 树tree zty出品

从该节点到该节点往下连接的最长路径的连接的数量The height of a node is the number of edges on the longest path between that node and a leaf.其次,树结构就像真的树一样,每一个分支,也就是结点,都链接这许多分支,而树的根则是树的第一个元素,不被任何结点链接。树高即为根所连接的最长路径下的节点的层次The height of a tree is the height of its root node.

zty20120913的博客 1534

数据结构 树(Tree)

树(Tree)是一种重要的非线性数据结构,它以分层方式组织数据。树由一组以边连接的节点组成,其中一个节点被称为根节点,其他节点分层次地连接到根节点,形成了层级结构。

Johnny-He的博客 1363

C++ | Tree的实现(适用于一般的树)

其实主要是采用类似c这种面向过程的语言的接口实现办法,用c++更多只是为了调用队列,栈等一些接口 网上资料大部分树的实现都是二叉树,而实际常见的树一般是普通的树 所以我们要学会通过二叉树的思想来转换到普通的树来使用 本文采用的存储结构为(孩子-兄弟)结点表示法,也叫二叉链表,有不懂得地方可以查看我的另外一篇关于树的存储结构的文章 本文重点讨论三个函数,其他实现函数都大同小异 求树的深度 打印树...

perry0528的博客 2万+

Linux内核数据结构之 radix tree

今天,我们来学习Linux内核第二个基础数据结构基数树

小鱼学编程 2520

【数据结构】树tree

节点(node)的集合,要么空集,要么包含root(node r)和多个非空子树。有n个节点的树有n-1个结点的边。

David_Hzy的博客 970
上一篇: 图解算法之排序算法(6)——快速排序
下一篇: [Error] iostream.h: No such file or directory的解决办法
刘凯KAI
博客等级 码龄15年 663粉丝 128原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值