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

🚩纸上得来终觉浅, 绝知此事要躬行。
🌟主页: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.mzph.cn/news/76294.shtml

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

相关文章

Pytorch Advanced(三) Neural Style Transfer

神经风格迁移在之前的博客中已经用keras实现过了,比较复杂,keras版本。 这里用pytorch重新实现一次,原理图如下: from __future__ import division from torchvision import models from torchvision import transforms from PIL…

零碎的c++二

虚函数 虚函数是C中实现多态的一种机制,它允许通过基类指针或引用来调用派生类的成员函数。虚函数的作用是实现动态绑定,即在运行时根据对象的实际类型来确定调用哪个函数。虚函数的声明方式是在函数前加上关键字virtual,如: cl…

Json“牵手”亚马逊商品详情数据方法,亚马逊商品详情API接口,亚马逊API申请指南

亚马逊平台是美国最大的一家网络电子商务公司,亚马逊公司是1995年成立,刚开始只做网上书籍售卖业务,后来扩展到了其他产品。现在已经是全世界商品品种最多的网上零售商和第二互联网公司,亚马逊是北美洲、欧洲等地区的主流购物平台…

数据结构:线性表之-循环双向链表(万字详解)

目录 基本概念 1,什么是双向链表 2,与单向链表的区别 双向链表详解 功能展示: 1. 定义链表 2,创建双向链表 3,初始化链表 4,尾插 5,头插 6,尾删 判断链表是否被删空 尾删代码 7&a…

我们这一代人的机会是什么?

大家好,我是苍何,今天作为专业嘉宾参观了 2023 年中国国际智能产业博览会(智博会),是一场以「智汇八方,博采众长」为主题的汇聚全球智能技术和产业创新的盛会,感触颇深,随着中国商业…

JVM相关知识点

Java可以跨平台的原因 Java可以跨平台的原因是因为它使用了Java虚拟机(JVM)作为中间层。Java源代码首先被编译成字节码,然后由JVM解释执行或即时编译成本地机器代码。这样,在不同的操作系统上,只需要安装适合该操作系…

9月11日作业

思维导图 代码 #include <iostream> #include<string.h>using namespace std;class myString { private:char *str; //记录c风格的字符串int size; //记录字符串的实际长度 public://无参构造myString():size(10){str new char[size]; …

从零学算法2849

2849.给你四个整数 sx、sy、fx、fy 以及一个 非负整数 t 。 在一个无限的二维网格中&#xff0c;你从单元格 (sx, sy) 开始出发。每一秒&#xff0c;你 必须 移动到任一与之前所处单元格相邻的单元格中。 如果你能在 恰好 t 秒 后到达单元格 (fx, fy) &#xff0c;返回 true &a…

目标检测YOLO实战应用案例100讲-毫米波辐射图像去模糊重建与目标检测(续)

目录 3.3基于RSRN模型的毫米波辐射图像去模糊重建方法 3.3.2非线性映射 3.3.3多尺度模糊提取

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

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

vue中打印指定dom元素

和window.print()效果一样&#xff0c;调出打印窗口&#xff0c;只是当前使用的插件是vue-print-nb 官网地址&#xff1a;vue-print-nb vue2中使用 安装插件 npm install vue-print-nb --save导入插件 import Print from vue-print-nb // 全局使用 Vue.use(Print);//or// 单…

如何确保ChatGPT的文本生成对特定行业术语的正确使用?

确保ChatGPT在特定行业术语的正确使用是一个重要而复杂的任务。这涉及到许多方面&#xff0c;包括数据预处理、模型训练、微调、评估和监控。下面我将详细介绍如何确保ChatGPT的文本生成对特定行业术语的正确使用&#xff0c;并探讨这一过程中的关键考虑因素。 ### 1. 数据预处…

JVM类加载机制

目录 一、Java为什么是一种跨平台的语言&#xff1f; 二、Java代码的执行流程 解释执行为主&#xff0c;编译执行为辅&#xff1a; 三、类加载的过程 3.1、加载 类加载器&#xff08;就是加载类的&#xff09;分为&#xff1a; 3.1.1、启动类加载器&#xff08;Bootstrap…

UMA 2 - Unity Multipurpose Avatar☀️三.给UMA设置默认服饰Recipes

文章目录 🟥 项目基础配置🟧 给UMA配置默认服饰Recipes🟨 设置服饰Recipes属性🟥 项目基础配置 将 UMA_DCS 预制体放到场景中创建空物体,添加DynamicCharacterAvatar 脚本,选择 HumanMaleDCS作为我们的基本模型配置默认Animator 🟧 给UMA配置默认服饰Recipes 服饰Re…

回归预测 | MATLAB实现PCA-BP主成分降维结合BP神经网络多输入单输出回归预测

回归预测 | MATLAB实现PCA-BP主成分降维结合BP神经网络多输入单输出回归预测 目录 回归预测 | MATLAB实现PCA-BP主成分降维结合BP神经网络多输入单输出回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 MATLAB实现PCA-BP主成分降维算法结合BP神经网络多输入单输出回…

Linux命令(78)之read

linux命令之read 1.read介绍 linux命令read用来接收键盘或其它文件的输入&#xff0c;得到输入后&#xff0c;read命令将接收的数据放入到标准变量中。 2.read用法 read [参数] [变量名称] read常用参数 参数说明-p后面跟提示信息-e可以使用命令补全功能-n输入文本的长度-s…

【数据结构】串

串 串的顺序实现简单的模式匹配算法KMP算法KMP算法的进一步优化 串的顺序实现 初始化 #define MaxSize 50 typedef char ElemType;//顺序存储表示 typedef struct{ElemType data[MaxSize];int length; }SString;/*** 初始化串*/ void InitString(SString *string) {for (int …

点云从入门到精通技术详解100篇-基于车载激光点云的道路标线提取及分类方法

目录 前言 车载 LiDAR 技术基础理论 2.1 车载 LiDAR 系统组成 2.2 车载 LiDAR 系统工作原理

Python基础continue和break关键字

continue 和 break 关键字 continue 含义&#xff1a;表示跳过本次循环&#xff0c;继续下次循环 注意&#xff1a;continue在while循环中不可以使用 例子&#xff1a; for i in range(5): if i 3: continue else: print(i) #结果为0,1,2,4 当i 3的时候&#xff0c;跳…

变压器耐压试验电压及电源容量的计算

被试变压器的额定电压为&#xff08;11081. 25%&#xff09; /10. 5kV&#xff0c; 联接组标号为 YNd11。 试验时高压分接开关置于第 1 分接位置&#xff0c; 即高压侧电压为 126kV&#xff0c; 高、 低压电压比 K1126/&#xff08;√310. 5&#xff09; 6. 93。 现以 A 相试验…