【数据结构】树的基础入门

news2024/11/24 15:52:17

文章目录

  • 什么是树
  • 树的常见术语
  • 树的表示
  • 树的应用

什么是树

相信大家刚学数据结构的时候最先接触的就是顺序表,栈,队列等线性结构.
而树则是一种非线性存储结构,存储的是具有“一对多”关系的数据元素的集合

非线性 体现在它是由n个有限结点(可以是零个结点)组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的
一对多 体现在比如对图中A来说,A对于和B,C都存在联系,同理B,C与其他的也均存在关系

在这里插入图片描述

树的常见术语

节点的度:一个节点含有的子树的个数称为该节点的度(上图A的为2)
叶节点/终端节点:度为0的节点称为叶节点(上图DEFGH节点为叶节点)
非终端节点/分支节点:度不为0的节点,(上图A,B,C)
双亲节点/父节点:若一节点含有子节点,此节点称为其子节点的父节点(上图A是B的父节点)
孩子节点或子节点:一节点含有的子树的根节点称为该节点的子节点(上图B是A的孩子节点)
兄弟节点:具有相同父节点的节点互称为兄弟节点(B、C是兄弟节点)
树的度:一棵树中,最大的节点的度称为树的度(上图B的度最大,故树的度为3)
堂兄弟节点:双亲在同一层的节点互为堂兄弟(如上图D,E互为兄弟节点)
节点的祖先:从根到该节点所经分支上的所有节点(上图A是所有节点的祖先)
子孙:以某节点为根的子树中任一节点都称为该节点的子孙(上图所有节点都是A的子孙)
森林:由n(n>0)棵互不相交的树的集合称为森林

此外,另有两个术语需要单独讨论一下,即

节点的层次:从根开始定义起,有两种说法
①根为第1层,根的子节点为第2层…
②根为第0层,根的子节点为第1层…
树的高度或深度:树中结点的最大层次



比如,只有一个节点,A是第0层,也可以说是第1层,两者都是正确的
但是我更推荐说A是第1层,因为如果A是第0层,高度或深度就为0,
那么对于空树来说,它就只能是-1层,显然不合理
那么如果A是第1层,高度或深度就为1;而空树的高度或深度就为0了,个人认为这种安排更加合理



在这里插入图片描述

树的表示

树有很多种表示方式如:双亲表示法,孩子表示法、孩子双亲表示法以及孩子兄弟表示法等.

首先我们来看一种比较差的表示

struct TreeNode
{
	int val;
	struct  TreeNode* child1;
	struct  TreeNode* child2;
	struct  TreeNode* child3;
	//...
};    //缺点很明显,浪费空间,对于度只有1或0的节点就会浪费结构体内的空间

//或者稍微改进一下
struct TreeNode
{
	int val;
	struct  TreeNode* childArray[5];
};  //同理,如果没有5个孩子的节点也会浪费空间

现在介绍一种非常常用且厉害的方法: 孩子兄弟表示法

struct TreeNode
{
	int val;
	struct  TreeNode* firstChild;
	struct  TreeNode* brother;
};    

此方法的思路流程如下:(链表)
在这里插入图片描述

再比如 双亲表示法:只存在父亲节点的指针或者下标

#define size 100//树中结点的最大数量
#define dataType int//树结构中数据类型
//节点
typedef struct TreeNode{
    dataType data;//树中结点的数据类型
    int parent;//它的父结点在数组中的位置下标
}TreeNode;
//树结构:  (上面的方法没有写这个树结构是因为上面是本质是链表,而这里是数组)
typedef struct {
    PTNode nodes[size];//存放树中所有结点
    int r,nums;//根的位置下标和结点数
}Tree;

逻辑思路如下(数组)
在这里插入图片描述

树的应用

1.文件系统:计算机的文件系统通常采用树形结构来组织文件和目录。根节点是文件系统的根目录,每个目录可以包含子目录和文件,这种结构可以方便地组织和访问文件。
2.数据库索引:数据库中的索引通常使用B树或B+树这样的树形结构来实现。树的节点包含关键字和指向其他节点的指针,可以快速地搜索和访问数据库中的数据。
3.解析树:编译器常使用树形结构来表示程序的语法结构。每个节点代表一个语法规则或语句,子节点表示该语句的组成部分,这种结构可以方便地进行语法分析和代码生成。

:这只是树形结构在实际中的一部分应用,它的灵活性和易于理解性使其成为许多领域中常用的数据结构。

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

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

相关文章

Google云数据库的“Enterprise“和“Enterprise Plus“版怎么选

最近,Google Cloud SQL(Google云上的RDS)做了一次大的产品调整与发布:将原来的Cloud SQL分为了两个版本,分别为"Enterprise"和"Enterprise Plus"版本。本文概述了两个版本的异同,以帮助…

全解私域流量搭建细节剖析

一、找准吸粉引流的渠道和方式 引流思路: 引流方式:

微信协议开发

人微信号的二次开发可以包括但不限于以下方面: 自定义菜单:根据个人需求设置自定义,方便快速访问常用功能或链接。 消息管理:通过开发接口,实现消息的自动回复、关键词匹配等功能,提供更好的用户体验。 …

基础算法--理解递归

理解递归 递归的两个特点 调用自身结束条件 举个从小就听过的例子: 1. 从前有座山,山中有座庙,庙里有个老和尚,老和尚在给小和尚讲故事:2. 从前有座山,山中有座庙,庙里有个老和尚,…

unity scene场景调整好后让game窗口的视角与scene相同

调整scene中场景视角 选中相机 然后 如果要实现相反的功能 即scene的视角与game的一样则 选中相机

目标检测笔记(十四): 使用YOLOv8完成对图像的目标检测任务(从数据准备到训练测试部署的完整流程)

文章目录 一、目标检测介绍二、YOLOv8介绍三、源码获取四、环境搭建4.1 环境检测 五、数据集准备六、 模型训练6.1 方式一6.2 方式二6.3 针对其他任务 七、模型验证八、模型测试九、模型转换9.1 转onnx9.1.1 方式一 9.2 转tensorRT9.2.1 trtexec9.2.2 代码转换9.2.3 推理代码 一…

问道管理:炸裂上涨,“神奇力量”!Mate 60 Pro+来了

今天上午,同花顺软件刚增添的光刻机板块大爆发,光刻胶板块也大涨。早年两年的光伏,到本年上半年的光模块,再到最近的光刻胶、光刻机,股民评论:“光”,充溢奇特的力气。 上午收盘,上…

SQLite加密解密

Android 微信备份 微信聊天记录导出(2020新版) Android数据库加解密逆向分析(三)——微信数据库密码破解 微备份 论坛讨论 解密sqlite db数据库文件 转自windwos 安装 pysqlcipher3 下载 pysqlcipher 去https://pypi.org/search/?qpysqlcipher&…

Python并发编程实战,用多线程、多进程、多协程加速程序运行

文章目录 1. 并发 & 并行 、同步 & 异步1.1 并发 & 并行并发 Concurrency并行 Parallelism 1.2 同步 & 异步同步 Synchronous异步 Asynchronous 2. CPU密集型计算 & IO密集型计算2.1 CPU密集型(CPU-bound)2.2 IO密集型(I…

智慧工地可视化解决方案-智慧工地源码

智慧工地是指运用信息化手段,围绕施工过程管理,建立互联协同、智能生产、科学管理的施工项目信息化生态圈,并将此数据在虚拟现实环境下与物联网采集到的工程信息进行数据挖掘分析,提供过程趋势预测及专家预案,实现工程…

Redis 7 第九讲 微服务集成Redis 应用篇

Jedis 理论 Jedis是redis的java版本的客户端实现,使用Jedis提供的Java API对Redis进行操作,是Redis官方推崇的方式;并且,使用Jedis提供的对Redis的支持也最为灵活、全面;不足之处,就是编码复杂度较高。 …

js创建一个按钮添加到body中,设置宽度100px,高度30px,按钮文字一键登录,并为其添加点击事件

要为按钮添加点击事件,你可以使用 JavaScript 的 addEventListener 方法。以下是一个示例代码: // 创建按钮元素 var button document.createElement("button");// 设置按钮的宽度和高度 button.style.width "100px"; button.sty…

借助开源表单设计器,让办公流程化更顺畅!

什么样的软件可以实现办公流程化发展?这是很多粉丝朋友问到的问题,其实,作为低代码技术平台服务商,建议大家了解下开源表单设计器,它在当前数字化转型发展的潮流中具有可观的利用价值,可以助力不同行业实现…

Nginx 本地部署服务

nginx 部署服务 一、下载二、解压三、文件替换四、浏览器中输入五、离线部署瓦片服务 一、下载 可以到官网下载,官方网址:https://nginx.org/也可以用我发的包 二、解压 三、文件替换 解压打开后文件,双击 nginx.exe 浏览器输入 localhost…

RunnerGo:性能测试领域的领跑者

随着软件行业的飞速发展,性能测试已经成为确保应用程序稳定性和可靠性的重要环节。RunnerGo,作为一款由国内开发者基于Go语言自主研发的性能压测工具,正在受到越来越多人的关注。本文将详细介绍RunnerGo的优势、应用场景以及与其他测试工具的…

ABB REF615C-D HCFFAEAGABC2BAA1XD控制继电器

多功能保护:REF615C-D 继电器具备多种保护功能,包括过流、短路、地故障、欠频、过频、欠电压、过电压等,可用于监测和保护电力系统中的设备。 通信能力:该继电器支持通信协议,如IEC 61850、Modbus等,使其能…

DTCC 2023丨云原生环境下,需要什么样的 ETL 方案?

​2023年8月16日~18日,第14届中国数据库技术大会(DTCC 2023)于北京隆重召开,拓数派受邀参与本次大会,PieCloudDB 技术专家邱培峰在大会做了《云原生虚拟数仓 PieCloudDB ETL 方案设计与实现》的主题演讲,详…

uniapp 微信小程序最新隐私弹窗更新方案,更新后无法登录问题解决方案

1&#xff0c;在manifest.json文件中的mp-weixin 节点下&#xff0c;添加&#xff1a;"__usePrivacyCheck__": true 2&#xff0c;在需要的页面配置隐私保护弹窗&#xff0c;或者直接写到首页也可以 <uni-popup ref"popusAuthorization" type"cen…

VS编译.cu文件源文件无法打开matrix.h和mex.h问题

配置好cu和VS相关库文件后CUDA程序仍然报错&#xff1a;无法打开matrix.h和mex.h&#xff0c;解决办法&#xff1a; &#xff08;1&#xff09;这两个头文件是matlab中的&#xff0c;可能无法直接在VS中调用&#xff0c;可以通过添加外部依赖项的方法将matlab中的头文件的文件路…

如何将Word转换为PDF?了解PDF转换器的功能有多强大

现在问你“如何将Word转换为PDF”?你会使用什么方法?是使用word文档自带转换工具&#xff0c;还是使用转换器进行文件格式转换?其实无论使用哪种方法&#xff0c;只要能顺利将文件的格式进行转换&#xff0c;不出错&#xff0c;并且能节省时间&#xff0c;那就是好的方法。今…