算法数据结构-树(1)

数据结构:树(1)——树相关算法 本文给出了树相关算法,包括树的建立,树的遍历:先序遍历、中序遍历、后序遍历、层次遍历,以及遍历算法的应用。此外还有判断某棵二叉树是否为完全二叉树的算法。更多详细代码可见本人GitHub:DS #include <cstddef> #include <stdio.h> #include <malloc.h> typedef int Datatype; //定义数... 阅读详情

此文包含树,二叉树,满二叉树,完全二叉树,二叉查找树(BST Binary Search Tree,也可以成为排序二叉树,有序二叉树),平衡二叉树(BBT),红黑树,B-树,B+树,B*树。这里暂时不包含各树的java实现。其实下述概念只是本人一些笔记加深自己的理解

1:树

2:二叉树

每个节点最大只存在左右两个节点

3:满二叉树

对于一个深度为h的二叉树中,若节点的个数为2^h-1,则代表该树为一个满二叉树

4:完全二叉树

完全二叉树其实是

5:二叉查找树(Binary Serach Tree)

二叉查找树简称BST,又称为有序二叉树,排序二叉树,从名称可以看出,对于树中的节点是有序存在的,即左叶节点不为空的话肯定是小于跟节点的,那么对应的右叶节点不为空的话肯定是大于跟节点的,任意节点的左、右子树也分别为二叉查找树,不存在健值相同的节点。对于一个二叉查找树的查询时间复杂度为(O(log(n)最优的情况就是一个平衡二叉树-O(n)最差情况和链表的效率差一样,实际上最差情况它就是一个有序链表))

6:平衡二叉树(Balanced Binary Tree)

平衡二叉树可以简称BBT,它是二叉查找树的一个升级版,也是第一个引入平衡的树,它可以保证的查询的时间为O(log(n)).对于平衡二叉树来说,除了包含二叉查找树的特点之外,还有自己的要求:对于任意一个节点,它的左右子树的高度相差的绝对值不能超过1,若应为插入或者删除导致了这一条件不能符合,就会进行节点的旋转,最终要使这条件满足,使的整棵树肯定是维持一个平衡的状态,这也保证了不会因为节点的增删,导致其退化为一个有序链表最终,整个查询变为了O(log(n)).但是虽然平衡二叉树查询时间上有了保证,但是也是极大的增加了增删的复杂度(因为这里涉及到节点的旋转)。

7:平衡二叉树之2-3树

 

8:红黑树

红黑树也是平衡二叉树的升级版,红黑树是一个不完全平衡的二叉树(红黑树的某些节点可的左右子树的高度是相差超过1的),但它和平衡二叉树的查询时间复杂度一样为O(log(n)),但相对于平衡二叉树它的增删要简单的很多,它可以保证增删的时间复杂度一样为O(log(n))。红黑树在普通二叉树的基础上对每个节点增加了颜色的概念,它包含了下列5种特有的性质:

  1. 节点非红必黑
  2. 根节点必为黑色
  3. 每个叶节点(null或空节点)为黑色
  4. 对于红色节点它的子节点只能为黑节点(也就是说不存在连续的黑节点)
  5. 对于任意的节点到达任意尾节点(叶节点),中间经过的黑色节点数相同。这点也就是为何它被称为一个不完全平衡二叉树

红黑树在很多地方都有涉及例如java中hashmap在1.8之后,对于hash冲突的数据使用链表存储,但一旦链表中的元素个数超过了8那么就会将链表转化为红黑树,所以对于这一块代码的实现可以参考hashmap源码。

9:B树(B-Tree)

B树与上述树不同它不是一个二叉树,它是一个平衡多叉树,意味着它的任意节点可以包含多个子节点。它有着以下规则:

  1. 从子节点的角度来看:任意一个节点的子节点的数量在[2,M]之间(注:M阶代表一个树节点最多有多少个查找路径,M=M路,当M=2为2叉树,M=3为 3叉树),当然空树除外
  2. 从节点包含的关键字(关键字为参与树中排序的值,即可以为该值也可以为该值中的某个属性)的角度来看:任意一个节点中包含的关键字个数在[ceil(M/2)-1,M-1]之间(注:ceil()函数是一个向上取整的函数,即ceil(1.5)=2)
  3. 非叶子节点的关键字的个数=指向子节点的数量-1
  4. 如果假设任意一层关键字为K[1], K[2], …, K[M-1],并且满足K[i] < K[i+1];当前层中对应的子节点指针为P[1], P[2], …, P[M];那么P[1]指针指向的是小于K[1]的值,P[2]指针指向的是k[1]-k[2]之间的值依次下去,P[M]指针指向的是大于K[M-1]的值。若当前P[]指针无值指向就带空。
  5. 从排序方式来看:所有节点的关键字是按照增续的方式进行排序,依照左小右大的方式
  6. 所有的叶子节点都在同一层

如下图所示是一个M=3的B树:

对于B树与平衡二叉树来说最大的区别在于节点中包含的子节点的数量,也就是平衡二叉树相对于B树在树深上极大的减少(减少的多少与M值有关系),这也代表了B树的数据查询的次数已经复杂度降低。B树最优查询时间复杂度为O(log2(n)),n为关键字的个数(等同于二分法查找),与M无关。

特点:

B树相对于平衡二叉树的不同是,每个节点包含的关键字增多了,特别是在B树应用到数据库中的时候,数据库充分利用了磁盘块的原理(磁盘数据存储是采用块的形式(这是计算机管理存储器的逻辑块,硬件及操作系统往往将主存和磁盘存储区分割为连续的大小相等的块)存储的,每个块的大小为4K,每次IO进行数据读取时,同一个磁盘块的数据可以一次性读取出来,避免多次io操作)把节点大小限制和充分使用在磁盘块的大小范围;把树的节点关键字增多那么后树的层级比原来的二叉树少了。

10:B+树

B+树是B树的升级版,相对于B树,B+树的空间使用更少,平均查询效率完全接近与二分法查找法。B+树涞源与B树,所以B+树的基本定义与B树相同,除了有几点特殊:

  1. 任意一个非叶子节点中包含的关键字的数量和子节点的数量相同(也有认为和B树一样的为m-1),非叶子节点中不保存实际的数据(这点与B树也是不同,B树包含实际数据),只作为索引存在,实际的数据都保存在叶子节点中(这也是为何下图中叶子节点中包含了对于区段内的所有节点数),这样使得所有的查询都会落到叶子节点,因为对于b+树来说,所有叶子节点都在最后一层,也就意味着任意的查询,它对应查询的步骤都是相同的,其性能也等价于在关键字全集做一次二分查找,也就是O(log2(n))
  2. 非叶子节点中P[i]节点指向的是关键字范围在[K[i],K[i+1])(注:这里是半闭区间,B树是一个开区间),也可以这么理解每一节点关键值的最大值为父节点中最大值或者最小值。例如下图中第一层中的5其子节点中最小值。
  3. B+树为所有叶子结点增加一个链指针, 这样所有叶子节点就构成了一个有序(升序)链表

B+树与B树对比:

  1. 对于数据库中索引的应用场景来说,上文说到了每一个节点对应着一块磁盘块,因为对于B+树来说,非叶子节点不保存原始数据,这样相对于B树来说它在每一个节点中存储的关键字就会越多,那么对应的树的层度就会降低。相同的数据情况来说,整体B+树是要比B树要更矮胖这样对应的查询的效率最高。
  2. B+树整体查询性能稳定,不会向B树那样差距很大(原因在于B+树要查询到叶子节点才结束,而B树只需要匹配到合适节点结束那么最优情况下到根节点结束(这也是B树相对于B+树来说的优点),最差情况下也要匹配到叶子节点)。
  3. B+树全节点遍历更快:B+树因为叶子节点中包含了该树对应的所有数据,并且本质为一个有序链表,所以在便利起整个Tree中数据,B+树有着天然的优势。对于数据库中来说更是如此,在全表扫描的查询,B+树的优势体现无疑。
  4. B+树相邻接点的指针可以大大增加区间访问性,可使用在范围查询等,而B-树每个节点 key 和 data 在一起,则无法区间查找。

11:B*树

B*树是B+树的升级版,相对于B树在树的非根和非叶子结点再增加指向兄弟的指针;如下图所示:

对于当前非叶子节点中关键值与子节点的关系最少满足(2/3)*M的关系(B树,B+树中最少要满足(1/2)*M的关系),即当前块的使用率为从50%升到66%

对于B+树与B*的最大区别在于节点的分裂时:

  1. B+树的分裂:当一个结点满时,分配一个新的结点,并将原结点中1/2的数据复制到新结点,最后在父结点中增加新结点的指针;B+树的分裂只影响原结点和父结点,而不会影响兄弟结点,所以它不需要指向兄弟的指针;
  2. B*树的分裂:当一个结点满时,如果它的下一个兄弟结点未满,那么将一部分数据移到兄弟结点中,再在原结点插入关键字,最后修改父结点中兄弟结点的关键字(因为兄弟结点的关键字范围改变了);如果兄弟也满了,则在原结点与兄弟结点之间增加新结点,并各复制1/3的数据到新结点,最后在父结点增加新结点的指针;

从上述的描述可以看出,因为B*树分配新结点的概率比B+树要低所以B*树对于空间利用率要高于B+树。

总结:

其实不论二叉树,平衡二叉树,红黑树,B树,B+树,B*树从总体来看,它的思想都是使用二分法+数据平衡来提高平均查询效率,但每一种树都有自己的优缺点,适用于不同的场景情况下,没有哪一种数据结果可以说囊括解决所有的需求。

Python数据结构与算法(6.1)——树 本节系统地介绍了树的基本术语和结构,包括节点、边、根节点、父子关系、度、深度和高度等概念,建立对树结构的清晰认知。随后,通过详细的代码,展示了树的构建及其常用的遍历方法,包括前序、后序和层次遍历。 阅读详情

相关推荐

开源树结构算法

开源的树形结构算法容器,使用类似stl,结构也相似。

【数据结构与算法】树(Tree)【详解】

【知识框架】树是n(n>=0)个结点的有限集。当n = 0时,称为空树。有且仅有一个特定的称为根的结点。当n>1时,其余节点可分为m(m>0)个互不相交的有限集T1,T2,…,Tm,其中每个集合本身又是一棵树,并且称为根的子树。显然,树的定义是递归的,即在树的定义中又用到了自身,树是一种递归的数据结构。树的根结点没有前驱,除根结点外的所有结点有且只有一个前驱。树中所有结点可以有零个或多个后继。因此n个结点的树中有n-1条边。

DreamSun的博客 1万+

树型结构算法

树型结构算法树型结构算法树型结构算法树型结构算法

《算法系列》之树

树可以说是面试官最喜欢考的类型之一了,因为树作为基础数据结构的同时,实用性也很强,工作中树的数据结构也很常用。

小夏陌的博客 712

单相全桥逆变器中比例谐振(PR)控制的优化设计与实现

本文深入探讨了比例谐振(PR)控制在单相全桥逆变器中的优化设计与实现。通过对比PID控制,详细阐述了PR控制在50Hz基波频率处实现无静差跟踪和强抗干扰性的原理。文章提供了从理论建模、参数整定(Kp, Kr, ωc)到仿真验证的完整实战流程,并介绍了准比例谐振(QPR)控制以增强频率鲁棒性,以及多谐振点设计以抑制特定谐波等进阶优化方法,最终实现THD从3%降至1%以内的显著性能提升。

weixin_29056781的博客 176

【板栗糖GIS】新装ArcGIS必调的12个隐藏设置——【效率翻倍指南】

本文详细介绍了新装ArcGIS后必调的12个隐藏设置,涵盖性能优化、路径管理、显示调校、工作流定制等方面,帮助用户显著提升GIS工作效率。从关闭后台地理处理到启用硬件加速,再到个性化快捷键配置,这些实用技巧能让ArcGIS运行更流畅,操作更便捷。

weixin_42524945的博客 544

树的算法总结

写在前言 (感谢代码随想录博主 博主是c++代码,此刷题总结是java代码,下文是我学习博主刷题记录的笔记) 递归三部曲: 找终止条件:什么时候递归到头了? 思考返回值,每一级递归应该向上返回什么信息? 单步操作应该怎么写?因为递归就是大量的调用自身的重复操作,因此从宏观上考虑,只用想想单步怎么写就行了,左树和右树应该看成一个整体,即此时树一共三个节点:root,root.left,root.right。 1.二叉树的遍历 1.递归版本 1.前序遍历;先访问根结点,然后再访问左子树,最后访问右子树 2.

weixin_45017459的博客 3026

历史预测+LLM双杀!DriveGPT4-V2闭环驾驶配置避坑指南

本文深入探讨了DriveGPT4-V2在工程化部署中的核心挑战与解决方案。通过融合历史轨迹预测与大语言模型,该模型旨在实现更可靠的端到端自动驾驶。文章详细解析了从环境配置、多模态Token对齐、轻量控制头设计到训练优化与闭环仿真验证的全流程,为开发者提供了一份详实的避坑指南。

transformer2023的博客 383

算法基础——树

该博客主要介绍树的相关知识。树是重要的非线性数据结构,涉及树的定义、基本术语、有序与无序树、有根与无根树等概念。存储方式有孩子表示法,包括用vector数组和链式前向星实现,vector数组虽耗时但一般不影响算法竞赛。遍历方法有深度优先遍历(DFS)和宽度优先遍历(BFS),并分别给出用vector数组和链式前向星存储时的实现代码,还展示了DFS和BFS处理特定输入数据的过程,此外还给出了斐波那契数列的递归实现代码。

阳光开朗大男孩 = ̄ω ̄=的博客 674

UE4_用户控件_6_通过控件蓝图内部变量来修改进度条的值

发现控件类图类的引用和用户控类引用不兼容,修改变量类型。我们需要添加到视口,同时设置输入模式。创建按钮的点击事件,当点击时调用角色的自定义事件clearwidget。可以了,但是没有退出控件,没有鼠标,所以改进一下。

Growthofnotes的博客 1236

双有源桥变换器(DAB)TPS控制:从理论建模到Simulink/PSIM仿真实践

本文深入探讨了双有源桥变换器(DAB)的三重移相(TPS)控制技术,从理论建模到仿真实现。文章详细分析了TPS相比SPS和DPS的优势,阐述了其12种工况的划分逻辑与电流应力最优调制策略,并提供了在Simulink和PSIM平台搭建仿真模型的详细步骤与实战经验,帮助工程师掌握这一高效控制方法。

white的博客 584

算法:什么是树以及树相关概念

树的定义 树是用来处理一对多的数据结构 树是n(n>=0)个节点的有限集 n = 0, 叫做空树 n > 0: 根节点是唯一的 子树的个数没有限制,但是一定是不相交的 树的度 节点拥有的子树数量称为节点的度 。 根据各个节点的度的不同,节点可以分为: 叶子节点(Leaf) [也叫做终端节点]: 度为0的节点 分支节点[也叫做非终端节点]: 度不为0 内部节点: 除了根节点之外,分支节点也叫做内部节点 树的度是树内各节点的度的最大值 节点间关系 当前节

OceanStar的博客 2435

别再只调OpenCV参数了!手把手教你用Python bm3d库搞定图像去噪(附完整代码与效果对比)

本文详细介绍了BM3D算法在图像去噪中的高级应用,通过Python bm3d库实现超越OpenCV传统方法的去噪效果。文章包含完整代码示例、参数调优技巧及工程化应用场景,帮助开发者掌握这一被称为'传统方法天花板'的技术,显著提升图像信噪比和细节保留能力。

weixin_28362173的博客 366

数据结构和算法——树(1)

数据结构和算法——树(1)一、二叉树1.1 二叉树的结点结构定义1.2 二叉树的建立1.3 二叉树的遍历方式二、优先队列2.1 什么是优先队列2.2 优先队列的实现方式2.2.1 使用`Python`中的`list`来实现。2.2.2 使用堆来实现优先队列三、哈夫曼树3.1 构造哈夫曼树的算法3.2 哈夫曼算法的实现四、二叉排序树(二叉搜索树)4.1 二叉排序树插入4.2 二叉排序树查找4.3 二叉排序树删除4.4 二叉排序树及其操作的实现 一、二叉树 二叉树是一种最简单的树形结构,它的特点是树中的每个结点

BELL__Meng的博客 588

从零开始:使用英伟达nx开发板部署目标检测算法的全过程

英伟达nx开发板烧录、依赖安装、开发板联网

weixin_51192760的博客 3761

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

数据结构与算法-树1

1.树的定义 树(Tree)是n(n≥0)个有限数据元素的集合。当n=0 时,称这棵树为空树。在一棵非树T 中: (1)有一个特殊的数据元素称为树的根结点,根结点没有前驱结点。 (2)若n>1,除根结点之外的其余数据元素被分成m(m>0)个互不相交的集合T1,T2,…,Tm,其中每一个集合Ti(1≤i≤m)本身又是一棵树。树T1,T2,…,Tm 称为这个根结点的子树。 可以看出,在树的

simon_woo_coding的专栏 641

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

【数据结构与算法】AVL树(1)——简介

文章目录AVL树的来源AVL树的定义AVL树的高度最小结点数最大结点数相关文章 AVL树的来源   AVL树得名于它的发明者G. M. Adelson-Velsky和Evgenii Landis。在计算机科学中,AVL树是最早被发明的自平衡二叉查找树。在AVL树中,任一节点对应的两棵子树的最大高度差为1,因此它也被称为高度平衡树。 AVL树的定义 ·它是一棵二叉搜索树; ·对任意结点X,X左右子树...

葑鈊丶 2065

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

数据结构算法系列1-哈夫曼树、AVL树、红黑树

1. 树的定义 树是由N个结点构成的有限集合,每个节点都有0个或者多个互不相交的树,称为结点的子树。 结点的度:结点的子树个数 树的度:树中所有结点中最大的度 叶结点:度为0的结点 父结点:有子树的结点是其子树的根结点的父结点 子树是不相交的 2. 二叉树 度为2的树,子树有左右顺序之分。 3. 哈夫曼树 一棵二叉树,该树的带权路径长度达到最小,称为最优二叉树,也称为哈夫曼树(Huffman ...

哼哼的博客 1007

【王道】数据结构与算法树(八——1)

✍、王道数据结构与算法树(八——1)

Augenstern_QXL的博客 1424

《算法与数据结构》第六章[第1节]:树

本文将认识树这一数据结构的基本概念和定义。树——一种一对多的非线性数据结构。文章详细阐述了树的递归定义、相关术语(如度、叶结点、分支结点、层次等)以及有序树与无序树的区别。此外,还介绍了树的抽象数据类型及其基本操作,包括初始化、销毁、创建、清空等。树的结构特点使其适用于处理具有层次关系的数据,是计算机科学中重要的数据结构之一。

NixLockhart的博客 1169

【数据结构】树的相关算法1

文章目录[剑指 Offer 68 - II. 二叉树的最近公共祖先](https://leetcode-cn.com/problems/er-cha-shu-de-zui-jin-gong-gong-zu-xian-lcof/) 剑指 Offer 68 - II. 二叉树的最近公共祖先 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; *

py今天刷题了吗 129

数据结构与算法-1树的同构

Description 给定两棵树T1和T2。如果T1可以通过若干次左右孩子互换就变成T2,则我们称两棵树是“同构”的。例如图1给出的两棵树就是同构的,因为我们把其中一棵树的结点A、B、G的左右孩子互换后,就得到另外一棵树。而图2就不是同构的。 现给定两棵树,请你判断它们是否是同构的。 Input 输入数据包含多组,每组数据给出2棵二叉树的信息。对于每棵树,首先在一行中给出一个非负整数N (≤1...

jialChen的博客 367

算法与数据结构学习1-树

树 最小深度 先判断左右子树是否存在为空的情况,如果某一边为空,则返回另一边的深度(因为此时并没有到达叶节点,所以需要继续下去);否则的话,使用递归方法求最小深度。->最大深度则很简单,直接递归求最大就好。 class Solution { public: int run(TreeNode *root) { vector<int> res; ...

soul-chang 的博客 224

数据结构与算法——树的定义(1)

树的定义 划重点 1、n>0时,根节点是唯一的,不可能存在多个根节点(不能和平常的大树混淆) 2、m>0时,子树的个数没有限制,但它们一定是互不相交的 eg.下图的就不符合树的定义: 结点的分类 树的结点包含一个数据元素及若干指向其子树的分支 结点拥有的子树数称为结点的度 度为 0 的结点称为叶节点(终端结点) 度不为 0 的结点称为非终端节点(分支结点) 除根节点之外,分支结点...

wangshipeng409的博客 393

一起刷算法与数据结构-树篇1

重建二叉树 二叉树的下一个节点 树的子结构 二叉树的镜像 对称的二叉树 不分行从上往下打印二叉树 二叉搜索树的后续遍历序列 二叉树中和为某一值的路径 二叉搜索树的第K个节点 二叉树的深度...

chandfy的博客 588
上一篇: 算法数据结构-Trie树
下一篇: Synchronized原理和jdk1.8后的优化
F_Hello_World
博客等级 码龄11年 38粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值