数据结构——树的基础概念

news2024/12/23 18:18:18

目录

1.树的概念

2.树的相关概念 

3.树的表示

(1)直接表示法

(2)双亲表示法 

(3)左孩子右兄弟表示法 

  4.树在实际中的运用(表示文件系统的目录树结构)


1.树的概念

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

而我们数据结构中的树是这样的:

有一个特殊的结点,称为根结点,根结点没有前驱结点除根结点外,其余结点被分成M(M>0)个互不相交的集合T1、T2、……、Tm,其中每一个集合Ti(1又是一棵结构与树类似的子树。

每棵子树的根结点有且只有一个前驱,可以有0个或多个后继 因此,树是递归定义的

在这里有一个要注意的点就是:在树形结构中,子树之间不能有交集,否则就不是树形结构。什么意思呢?例如B和C是A的子树,而在树形结构中,它们不能有任何交集,类似于:

如果一个树形结构的字树相交的话,这个结构就不能称之为树形结构。

2.树的相关概念 

 这里有一张图,我们接下来关于树的各个概念都是围绕这张图展开的:

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

叶结点或终端结点:度为0的结点称为叶结点; 如上图:B、C、H、I...等结点为叶结点,

简单来说,没有子节点的节点就被称为叶子节点

非终端结点或分支结点:度不为0的结点; 如上图:D、E、F、G...等结点为分支结点,

所以我们可以说一棵树是由所有分支节点加所有叶子节点组成的

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

孩子结点或子结点:一个结点含有的子树的根结点称为该结点的子结点; 如上图:B是A的孩子结点

兄弟结点:具有相同父结点的结点互称为兄弟结点; 如上图:B、C是兄弟结点

树的度:一棵树中,最大的结点的度称为树的度; 如上图:树的度为6,因为在这棵树中,度最大的结点是A,它有六个子节点,也是这棵树中子节点最多的结点,所以A的度就是这棵树的度。

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

树的高度或深度:树中结点的最大层次; 如上图:树的高度为4

堂兄弟结点:双亲在同一层的结点互为堂兄弟;如上图:H、I互为兄弟结点

结点的祖先:从根到该结点所经分支上的所有结点;如上图:A是所有结点的祖先,对于Q来说J,E,A是它的祖先

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

森林:由m(m>0)棵互不相交的树的集合称为森林; 什么意思呢?只要有两棵及以上不相交的树,我们就可以将其称为森林。

3.树的表示

树结构相对线性表就比较复杂了,要存储表示起来就比较麻烦了,既要保存值域也要保存结点和结点之间的关系,实际中树有很多种表示方式如:双亲表示法,孩子表示法、孩子双亲表示法以及孩子兄弟表示法 等。我们在这里简单的介绍这些方法:

(1)直接表示法

   使用直接表示法我们要先了解树的度,如果树的度是6,我们就要定义6个指针表示它们:

struct TreeNode
{
	int data;//数据
	struct TreeNode* child1;//指向孩子节点的指针
	struct TreeNode* child2;
	//...
    struct TreeNode* child6;

}

(2)双亲表示法 

二十五双亲表示法比较简单,只要定义一个指向父节点的指针就可以:

struct TreeNode
{
   int data;
   struct TreeNode* parent;
}

(3)左孩子右兄弟表示法 

我们先将这种方法的表示写出来:

struct TreeNode
{
  int val;
  struct TreeNode* letfchild;
  struct TreeNode* rightbrother;
}
  

“左孩子”表示这个指针只指向该结点的最左边的子结点,而它的子节点的“左孩子”也指向它自己最左边的子结点:

而它的“右兄弟”指针则向右边寻找兄弟结点,如果有兄弟结点,则指向它,然后继续向右找,直至右边找不到兄弟结点,“右兄弟”指针就指向空,这样一来,无论这棵树有多少子结点都可以用两个指针表示,“左孩子右兄弟”表示法也因其巧妙而被广泛使用。

  4.树在实际中的运用(表示文件系统的目录树结构)

  树在实际生活中出现得最多的场景就是在我们计算机中资源管理器文件系统的目录结构中,我们打开一个文件夹,里面有若干个文件,那么这个文件夹就是根结点,那若干个文件就是它的子结点:

 怎么样,以这样的方式展开文件夹,它是不是就是我们数据结构中的树形结构呢。 

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

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

相关文章

找不到msvcp120.dll无法继续执行的原因分析及解决方法

在计算机使用中,经常会遇到msvcp120.dll文件丢失的情况,很多人对这个文件不是很熟悉,今天就来给大家讲解一下msvcp120.dll文件的丢失以及这个文件的重要性,让大家更好地了解计算机,同时也可以帮助我们更好地掌握这个文…

EVM-MLIR:以MLIR编写的EVM

1. 引言 EVM_MLIR: 以MLIR编写的EVM。 开源代码实现见: https://github.com/lambdaclass/evm_mlir(Rust) 为使用MLIR和LLVM,将EVM-bytecode,转换为,machine-bytecode。LambdaClass团队在2周…

leetcode216.组合总和III、40.组合总和II、39.组合总和

216.组合总和III 找出所有相加之和为 n 的 k 个数的组合,且满足下列条件: 只使用数字1到9 每个数字 最多使用一次 返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺序返回。 示例 1: 输入: k 3, n 7 输出…

【Spring Boot 源码学习】初识 ConfigurableEnvironment

《Spring Boot 源码学习系列》 初识 ConfigurableEnvironment 一、引言二、主要内容2.1 Environment2.1.1 配置文件(profiles)2.1.2 属性(properties) 2.2 ConfigurablePropertyResolver2.2.1 属性类型转换配置2.2.2 占位符配置2.…

单调栈(左小大,右小大)

①寻找每个数左边第一个比它小的数 给定一个长度为 N 的整数数列,输出每个数左边第一个比它小的数,如果不存在则输出 −1。 输入样例: 3 4 2 7 5 输出样例: -1 3 -1 2 2 从左到右遍历,用单调递增(栈底到栈顶…

Spring MVC 中 使用 RESTFul 实现用户管理系统

1. Spring MVC 中 使用 RESTFul 实现用户管理系统 文章目录 1. Spring MVC 中 使用 RESTFul 实现用户管理系统2. 静态页面准备2.1 user.css2.2 user_index.html2.3 user_list.html2.4 user_add.html2.5 user_edit.html 3. SpringMVC环境搭建3.1 创建module:usermgt3…

操作审计(一)

操作审计(一) 前言一、快速查询事件二、高级查询事件总结 前言 这里主要记录操作审计的过程,操作审计其实就是监控并记录阿里云账号的活动,可以使用阿里云的操作审计服务来审计最近90天阿里云账号下的操作,从而确保云…

纯正刊!IF不降反升,国人通过率高>98%,29天录用!无“爆雷”风险

本周投稿推荐 SCI • 能源科学类,1.5-2.0(来稿即录25天) • 计算机类,2.0-3.0(纯正刊29天录用) EI • 各领域沾边均可(2天录用) CNKI • 7天录用-检索(急录友好&a…

PhpStorm 2024 for Mac PHP集成开发工具

Mac分享吧 文章目录 效果一、下载软件二、开始安装1、双击运行软件(适合自己的M芯片版或Intel芯片版),将其从左侧拖入右侧文件夹中,等待安装完毕2、应用程序显示软件图标,表示安装成功3、打开访达,点击【文…

sql查询练习

1.表的结构 课程表:课程编号cid,课程名称canme,老师tid, 教师表:教师tid,教师姓名tname 分数表:学生student_sid,课程 cours_id,,分数score 学生表&#xff…

谷粒商城-个人笔记(集群部署篇二)

前言 ​学习视频:​Java项目《谷粒商城》架构师级Java项目实战,对标阿里P6-P7,全网最强​学习文档: 谷粒商城-个人笔记(基础篇一)谷粒商城-个人笔记(基础篇二)谷粒商城-个人笔记(基础篇三)谷粒商城-个人笔记(高级篇一)谷粒商城-个…

【SSL 1823】消灭怪物(非传统BFS)

题目大意 小b现在玩一个极其无聊的游戏,它控制角色从基地出发,一路狂奔夺走了对方的水晶,可是正准备回城时,发现地图上已经生成了 n n n 个怪。 现在假设地图是二维平面,所有的怪和角色都认为是在这个二维平面的点上…

鸿翼夯实统一AI基础设施,加速大模型落地释放AI“模”力!

从“百模大战”到“千模大战”,全球通用大模型数量快速增加,将大模型融入企业,建立企业自身的AI基础设施,打造行业或特定领域、任务的专用大模型,助力生产力革新和产业升级,已经成为目前企业关注的核心。 大…

Asp .Net Core 系列:基于 Castle DynamicProxy + Autofac 实践 AOP 以及实现事务、用户填充功能

文章目录 什么是 AOP ?.Net Core 中 有哪些 AOP 框架?基于 Castle DynamicProxy 实现 AOPIOC中使用 Castle DynamicProxy实现事务管理实现用户自动填充 什么是 AOP ? AOP(Aspect-Oriented Programming,面向切面编程&a…

实验二 图像的代数运算

一、实验目的: 1.了解图像的算术运算在数字图像处理中的初步应用。 2.体会图像算术运算处理的过程和处理前后图像的变化。 二、实验内容: 1.图像的加法运算 图像相加一般用于对同一场景的多幅图像求平均效果&…

c语言回顾-内存操作函数

目录 前言 1.memcpy 函数 1.1函数介绍 1.2与strcpy的区别 1.3memcpy的模拟 2.memmove 函数 2.1函数介绍和使用 2.2函数的模拟 3.memset函数 3.1函数介绍 3.2函数的模拟 4.memcmp函数 4.1函数的使用 4.2函数的模拟 结束语 前言 在动态内存的章节中小编详细讲解了动…

pandas数据分析(7)

组合DataFrame 连接 如果只是要将多个DataFrame粘合在一起,那么concat函数是最佳选择。在默认情况下,concat会将DataFrame按行粘合在一起,同时会将各列自动对齐。 如果想要按列进行粘合,需要将axis设置为1: concat的特…

​香橙派AIpro测评:usb鱼眼摄像头的Camera图像获取

一、前言 近期收到了一块受到业界人士关注的开发板"香橙派AIpro",因为这块板子具有极高的性价比,同时还可以兼容ubuntu、安卓等多种操作系统,今天博主便要在一块832g的香橙派AI香橙派AIpro进行YoloV5s算法的部署并使用一个外接的鱼眼USB摄像头…

【Git 学习笔记】gitk 命令与 git log 其他参数的使用

1.7 用 gitk 查看提交历史 # make sure you have gitk installed $ which gitk /usr/bin/gitk # Sync the commit ID $ git checkout master && git reset --hard 13dcad # bring up the gitk interface, --all to see everything $ gitk --all &实测结果&#xf…

11 - matlab m_map地学绘图工具基础函数 - 绘制航迹、椭圆、风向玫瑰图和特定的圆形区域的有关函数及其用法

11 - matlab m_map地学绘图工具基础函数 - 绘制航迹、椭圆、风向玫瑰图和特定的圆形区域的有关函数及其用法 0. 引言1. 关于m_track2. 关于m_range_ring3. 关于m_ellipse4. 关于m_windrose5. 结语 0. 引言 本篇介绍下m_map中绘制航迹图函数(m_track)、绘…