【数据结构】前言概况 - 树

news2024/11/16 21:57:08

🚩纸上得来终觉浅, 绝知此事要躬行。
🌟主页:June-Frost
🚀专栏:数据结构

🔥该文章针对树形结构作出前言,以保证可以对树初步认知。

目录:

  • 🌍前言:
  • 🌎树
    • ✉️相关概念
    • ✉️ 树的存储
    • ✉️ 树的应用
  • 🌏 二叉树
    • ✉️ 特殊二叉树
    • ✉️ 二叉树的存储
  • ❤️ 结语

🌍前言:

 线性结构是一种相对简单的数据结构,元素之间按照一定的顺序排列,每个元素最多有两个接口:前驱和后继。这种结构相对直观,易于理解和管理,类似一种 一对一 的关系。相比之下,树形结构则更为复杂,变为了 一对多 的关系。元素之间的关系不再是简单的线性排列,而是以一个或多个根节点为起点,通过多个分支来连接不同的元素。每个节点可以拥有多个子节点,而且每个子节点可以有任意多的兄弟节点。这种结构需要更多的内存空间来存储元素之间的关系,同时也需要更高级的算法来操作和管理。从复杂性的角度来看,树形结构比线性结构更加复杂
 此外,树的应用广泛,如二叉树、红黑树、B树、哈夫曼树等。在计算机科学中,树的数据结构常常被用于对数据进行组织和存储,以便于高效地实现各种算法和操作。


🌎树

 树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。


 注意:树是递归定义的,在树的定义中,一个树是由一个根节点和若干个子节点组成的,这些子节点本身也是一棵棵树。因此,树的结构和定义是相互嵌套的。通过递归定义,我们可以将一个树的结构描述为一个递归的过程,即每棵子树又包含着一个根节点和若干个子节点,直到叶节点为止。
⚠树形结构中,子树之间不能有交集,否则会成为 图。
例如:

✉️相关概念

以上图①为例:

  • 节点的度:一个节点含有的子树的个数称为该节点的度,如上图:A的为6。

  • 叶节点或终端节点:度为0的节点称为叶节点,如上图:B、C、H、I…等节点为叶节点。

  • 非终端节点或分支节点:度不为0的节点,如上图:D、E、F、G…等节点为分支节点。

  • 双亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点,如上图:A是B的父节点。

  • 孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点,如上图:B是A的孩子节点。

  • 兄弟节点:具有相同父节点的节点互称为兄弟节点,如上图:B、C是兄弟节点。

  • 树的度:一棵树中,最大的节点的度称为树的度,如上图:树的度为6。

  • 节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推。

  • 树的高度或深度:树中节点的最大层次,如上图:树的高度为4

  • 堂兄弟节点:双亲在同一层的节点互为堂兄弟,如上图:H、I互为兄弟节点。

  • 节点的祖先:从根到该节点所经分支上的所有节点,如上图:A是所有节点的祖先。

  • 子孙:以某节点为根的子树中任一节点都称为该节点的子孙,如上图:所有节点都是A的子孙。

  • 森林:由m(m>0)棵互不相交的树的集合称为森林。

✉️ 树的存储

 树的存储中既要保存值域,也要保存结点和结点之间的关系,有很多存储结构。例如:双亲表示法,孩子表示法、孩子双亲表示法以及孩子兄弟表示法等

🌟孩子兄弟表示法(LCRS)


🌟双亲表示法

 在每一个节点中,存储其父节点的下标。这样就可以将树中各节点的结构关系表示出来,也可以快速地对父节点进行访问。

✉️ 树的应用

 树形结构的应用非常广泛。如:

  1. 数据库中的索引:数据库系统使用树形结构来实现索引,以提高数据访问效率。
  2. 电子邮件系统:电子邮件系统中的邮件通常是通过树形结构进行组织和管理的,每个邮件可以有多个回复或转发,形成一个树形结构。
  3. 编译器中的语法树:编译器将源代码解析为语法树,其中每个节点表示特定的语法结构,如一个函数、一个循环或一个条件语句。
  4. 文件系统的目录树结构。

 在实践当中,用的最多的树是二叉树。

🌏 二叉树

 一棵二叉树是结点的一个有限集合,该集合可以为空,也可以由一个根节点加上两棵别称为左子树和右子树的二叉树组成。

 对于任意的二叉树都是由以下几种情况复合而成的:

例如:

注意:

  1. 二叉树不存在度大于2的结点
  2. 由于二叉树最多有2个孩子,为了区分概念,就定义了左孩子和右孩子,所以二叉树的子树有左右之分,次序不能颠倒 —— 二叉树是有序树

✉️ 特殊二叉树

🌟满二叉树
 一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。如果一个满二叉树的层数为K,结点总数就是2h-1,同样的,如果一个满二叉树的节点总数为N,则层数为log2(N+1)
🌟满二叉树
  假设有h层,前h-1层都是满的,最后一层不一定满,节点从左到右连续。要注意的是满二叉树是一种特殊的完全二叉树。假设有h层,则完全二叉树的节点范围为 [ 2(h-1) , 2h - 1]
🌟一些性质:

  1. 若规定根节点的层数为1,则一棵非空二叉树的第i层上最多有2(i-1)个结点.
  2. 若规定根节点的层数为1,则深度为h的二叉树的最大结点数是2h-1.
  3. 对任何一棵二叉树, 如果度为0的其叶结点个数为n0, 度为2的分支结点个数为n2 ,则有 n0= n2+1

✉️ 二叉树的存储

 二叉树的存储结构通常可以采用顺序存储和链式存储两种。

  1. 链式存储:对于一般的二叉树,通常采用链式存储方式。每个节点包含三个字段:数据域、左孩子指针和右孩子指针。数据域用于存储节点的值,左孩子指针指向该节点的左子节点,右孩子指针指向该节点的右子节点。如果某个节点没有子节点,对应的指针就为空(NULL)。
  2. 顺序存储:对于完全二叉树,可以直接使用数组进行存储,将根节点存储在索引为1的位置,然后按照层次顺序从左到右,从上到下,对每个节点赋予一个唯一的索引。这种存储方式对于完全二叉树来说,可以节省存储空间,并且可以通过索引快速访问节点。

 📚顺序存储结构和链式存储结构各有优劣,需要根据实际应用场景和需求来选择使用哪种存储方式。如果需要频繁查找且表的长度变化不大,可以使用顺序存储结构;如果需要频繁插入和删除操作且表的长度变化较大,使用链式存储结构可能会更好。


❤️ 结语

 文章到这里就结束了,如果对你有帮助,你的点赞将会是我的最大动力,如果大家有什么问题或者不同的见解,欢迎大家的留言~

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

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

相关文章

Python语义分割与街景识别(4):程序运行

前言 本文主要用于记录我在使用python做图像识别语义分割训练集的过程,由于在这一过程中踩坑排除BUG过多,因此也希望想做这部分内容的同学们可以少走些弯路。 本文是python语义分割与街景识别第四篇,关于程序的内容,也是差不多最…

【Unity编辑器扩展】| GameView面板扩展

前言【Unity编辑器扩展】| GameView面板扩展未运行时在Game视图进行绘制总结前言 前面我们介绍了Unity中编辑器扩展的一些基本概念及基础知识,还有编辑器扩展中用到的相关特性Attribute介绍。后面就来针对Uniity编辑器扩展中比较常用的模块进行学习介绍。本文就来详细介绍一下…

JAVA版的数据结构——链表

目录 1.单向不带头链表 1.1 链表的概念及结构 1.2 代码部分 1.3 完整的全部代码 2. 双向不带头链表 2.1 代码部分 2.2 完整的代码 3. MySingleList与MyLinkedList代码上的区别 4. LinkedList的使用 4.1 什么是LinkedList 4.2 LinkedList的使用 4.2.1 LinkedList的构…

【数据结构】堆的向上调整和向下调整以及相关方法

💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤 📃 文章目录 一、堆的概念二、堆的性质…

github上创建分支并合并到master

github上创建分支并合并到master 目录概述需求: 设计思路实现思路分析1.创建分支2.commit changes3.create pull request按钮4.网页解析器5.数据处理器 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,ful…

[deeplearning]深度学习框架torch的概念以及数学内容

(提前声明:这边的操作系统为ubuntn22.04,至于window上如何进行安装和导入按这边不是很理解) (另外代码样例基本不使用notebook,paddle等等在线工具,而是使用本机安装好的python环境,和pytorch框…

IDEA中maven的设置以及相关功能

Maven 项目介绍 学习前提 相对于传统的项目,Maven 下管理和构建的项目真的非常好用和简单,所以这里也强调下,尽量使用此类工具进行项目构建。 ## Maven 常用设置介绍 如上图标注 1 所示,我们可以指定我们本地 Maven 的安装目录…

模块化开发_groupby查询think PHP5.1

要求按照分类的区别打印出不同类别的数据计数 如张三,做了6件事情 这里使用原生查询先测试 SELECT cate_id, COUNT(*) AS order_count FROM tp_article GROUP BY cate_id;成功 然后项目中实现 public function ss(){$sql "SELECT cate_id, COUNT(*) AS orde…

RCNA 锐捷培训

第一章 网络基础入门 1.1 OSI参考模型及TCP/IP协议栈 数据是如何传输的? 数据在计算机网络中传输通常依赖于TCP/IP协议模型。 什么是网络? 网络是一种连接多个计算机、设备或系统的通信基础设施,其目的是实现资源共享、信息传递、接收和共享…

14.Xaml ProgressBar控件 进度条控件

1.运行效果 2.运行源码 a.Xaml源码 <Grid Name="Grid1"><!--Orientation="Horizontal" 进度条的方向 水平的还是垂直的Value="40" 进度的数值Minimum="0" 最小值Maximum

17. 线性代数 - 矩阵的逆

文章目录 矩阵的转置矩阵的逆Hi, 您好。我是茶桁。 我们已经学习过很多关于矩阵的知识点,今天依然还是矩阵的相关知识。我们来学一个相关操作「矩阵的转置」,更重要的是我们需要认识「矩阵的逆」 矩阵的转置 关于矩阵的转置,咱们导论课里有提到过。转置实际上还是蛮简单…

淘宝京东扣库存怎么实现的

1. 使用kv存储实时的库存&#xff0c;直接在kv里扣减&#xff0c;避免用分布式锁 2. 不要先查再扣&#xff0c;直接扣扣扣&#xff0c;扣到负数&#xff0c;&#xff08;增改就直接在kv里做&#xff09;&#xff0c;就说明超卖了&#xff0c;回滚刚才的扣减 3. 同时写MQ&…

小白也可以玩转CMake之常用必备

目录 1.设置编译器flags2.设置源文件属性3.链接器标志4.Debug与Release包 今天&#xff0c;分享一篇工作中经常用到的一些CMake命令&#xff0c;看完就学会了哦&#xff0c;更多CMake与C内容也期待加入星球与我一起学习呀~ 1.设置编译器flags 例如&#xff1a;设置C标准&#x…

论文笔记《3D Gaussian Splatting for Real-Time Radiance Field Rendering》

项目地址 原论文 Abstract 最近辐射场方法彻底改变了多图/视频场景捕获的新视角合成。然而取得高视觉质量仍需神经网络花费大量时间训练和渲染&#xff0c;同时最近较快的方法都无可避免地以质量为代价。对于无边界的完整场景&#xff08;而不是孤立的对象&#xff09;和 10…

C高级day4循环语句

1&#xff0c;思维导图 运行结果为&#xff1a; 运行结果为&#xff1a;

【基础计算机网络1】认识计算机网络体系结构,了解计算机网络的大致模型(下)

前言 在上一篇我们主要介绍了有关计算机网络概述的内容&#xff0c;下面这一篇我们将来介绍有关计算机网络体系结构与参考模型的内容。这一篇博客紧紧联系上一篇博客。 这一篇博客主要内容是&#xff1a;计算机网络体系结构与参考模型&#xff0c;主要是计算机网络分层结构、协…

search_engine:搜索引擎实现

目录 一.项目背景及原理 1.背景 2.原理 二.技术栈及项目环境 1.技术栈 2.项目环境 3.环境准备 三.模块划分 四. 遇到的问题及其解决方法 1.搜索结果出现重复文档的问题 2.实现httplib功能的问题 五. 项目特点 1.文档记录 2.竞价排名 3.去掉暂停词 4.模拟实现http…

云优先已死——云智能正在发生

混合云&#xff0c;即一些本地云和一些异地云&#xff0c;已经成为 IT 的默认架构&#xff0c;并且已经存在了一段时间了。然而&#xff0c;到目前为止&#xff0c;混合动力一直被视为通向完全公有云的过程中的过渡状态&#xff0c;许多人可能会居高临下地称之为“云成熟度”。…

1-3 AUTOSAR软件架构

目录 一、简介 二、基础软件层 BSW 2.1 微控制器抽象层 2.2 ECU抽象层 2.3 复杂的驱动程序 2.4 服务层 三、运行时环境 RTE 四、应用软件层 SWC 一、简介 分层架构是实现软硬件分离的关键&#xff0c;它使汽车嵌入式系统控制软件开发者摆脱了以往 ECU 软件开发与验证时…

ChatGPT AIGC Python实现自动切换年份进行动态图表可视化

按年份进行动态筛选数据的好处主要包括以下几点: 1. 时间段对比:通过按年份筛选数据,可以方便地进行不同年份之间的数据比较,观察数据的变化趋势。 2. 数据简洁:如果数据量过大,一次性展示可能会导致信息过于复杂,不易理解。按年份筛选可以将数据分段展示,使信息更加…