【数据结构】树的基础入门
文章目录
- 什么是树
- 树的常见术语
- 树的表示
- 树的应用
什么是树
相信大家刚学数据结构的时候最先接触的就是顺序表,栈,队列等线性结构.
而树则是一种非线性存储结构,存储的是具有“一对多”关系的数据元素的集合
非线性 体现在它是由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.解析树:编译器常使用树形结构来表示程序的语法结构。每个节点代表一个语法规则或语句,子节点表示该语句的组成部分,这种结构可以方便地进行语法分析和代码生成。
注:这只是树形结构在实际中的一部分应用,它的灵活性和易于理解性使其成为许多领域中常用的数据结构。
相关文章:

【数据结构】树的基础入门
文章目录 什么是树树的常见术语树的表示树的应用 什么是树 相信大家刚学数据结构的时候最先接触的就是顺序表,栈,队列等线性结构. 而树则是一种非线性存储结构,存储的是具有“一对多”关系的数据元素的集合 非线性 体现在它是由n个有限结点(可以是零个结点)组成一个具有层次关…...
【多线程】Thread的常用方法
Thread的常用方法 1.构造器 Thread提供的常见构造器说明public Thread(String name)可以为当前线程指定名称public Thread(Runnable target)封装Runnable对象成为线程对象public Thread(Runnable target,String name)封装Runnable对象成为线程对象,并指定线程名称…...

windows 下docker安装宝塔镜像 宝塔docker获取镜像
1. docker 安装宝塔 打开链接:https://www.docker.com/get-started,找对应的版本下载docker,安装docker打开百度云盘:链接:https://pan.baidu.com/s/1DGIjpKkNDAmy4roaKGLA_w 提取码:u8bi 2. 设置镜像 点…...

【FusionInsight 迁移】HBase从C50迁移到6.5.1(01)迁移概述
【FusionInsight 迁移】HBase从C50迁移到6.5.1(01)迁移概述 HBase从C50迁移到6.5.1(01)迁移概述迁移范围迁移前的准备HDFS文件检查确认HBase迁移目录确保数据落盘停止老集群HBase服务停止新集群HBase服务 HBase从C50迁移到6.5.1&a…...
ETCD集群搭建(实践可用)
概述 etcd 是兼具一致性和高可用性的键值数据库,可以作为保存 Kubernetes 所有集群数据的后台数据库。 - 官方网址: Documentation versions | etcd 准备cfssl证书生成工具 cfssl是一个开源的证书管理工具,使用json文件生成证书. 在任意一…...

基于stm32f103rct6的呼吸灯实现
一、PWM 我们可以通过改变灯的有效电压占空比来实现呼吸灯效果。其中我们要用到PWM(脉宽调制),通过pwm我们可以来改变高电平的占空比 占空比:在一个周期中,高电平所占整个周期的百分比 具体如图: 当我们用…...

关于火绒邮件监控引起的扫描任意IP会有25和110端口反馈
之前测试过公司的外网IP,因为之前一直很注意对外映射的端口,都限制了可以访问的IP地址和端口,所以之前扫描的时候是一个端口都扫描不出来的。最近闲的无事,想着再扫描试试,结果发现居然开放了25和110端口,我…...

物联网应用中蓝牙模块怎么选?_蓝牙模块厂家
在蓝牙模块选型前期,一定要了解应用场景以及需要实现的功能(应用框图),以及功能实现过程中所能提供调用的接口(主从设备,功能),考虑模块供电,尺寸,接收灵敏度…...
Mysql远程登录报错:Host ‘192.168.137.1‘ is not allowed to connect to this MySQL server
连接失败是因为数据库没有对指定的ip的服务器地址的连接进行授权,许哦一需要先进行授权。 1. 改表 先登录登录数据库:mysql -u root -p mysql>use mysql;mysql>update user set host % where user root;mysql>FLUSH PRIVILEGES; 2.授权 …...

vue去掉循环数组中的最后一组的某个样式style/class
vue去掉循环数组中的最后一组的某个样式style/class 需求:要实现这样的排列 现状 发现,最后一个格子并没有跟下面绿色线对齐。 最后发现 是因为 每个格子都给了 margin-right:36px,影响到了最后一个格子 所以要 将最后一个格子的…...

Vue2面试题100问
Vue2面试题100问 Vue2面试题100问1.简述一下你对Vue的理解2.声明式和命令式编程概念的理解3.Vue 有哪些基本特征4.vue之防止页面加载时看到花括号解决方案有哪几种?5.Vue中v-for与v-if能否一起使用?6.vue中v-if与v-show的区别以及使用场景7.v-on可以监听…...

开机启动应用
windows 建立快捷方式 winr 输入shell:startup 将快捷方式复制进来 就可以了 如果你有ccleaner,也可以看到...

RK3588平台产测之ArmSoM-W3 DDR压力测试
1. 简介 RK3588从入门到精通 ArmSoM团队在产品量产之前都会对产品做几次专业化的功能测试以及性能压力测试,以此来保证产品的质量以及稳定性 优秀的产品都要进行多次全方位的功能测试以及性能压力测试才能够经得起市场的检验 2. 环境介绍 硬件环境: …...

springboot初试elasticsearch
引入依赖 elasticsearch的依赖版本与你elasticsearch要一致 <dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId> </dependency> 索引库的操作 创建索引库 impo…...

Node.js安装教程图文详解
版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl 下载Node.js 请下载Node.js并保存至本地,官方网址:https://nodejs.org/zh-cn/ 在此,选择windows系统64位的16.13.1版本进行下载。 下载…...

laragon 为 php 安装 Xdebug 扩展
众所周知,php 自带的 var_dump() 输出格式很不直观 而 laragon 作为很好的 windos 下开发环境很受欢迎,本文就介绍如何快速为 laragon 的 php 安装 Xdebug,方便开发调试 一:启动开发环境,在任意可访问 php 页面中输出 …...
华为云 存在不支持迁移的外键解决方法
DRS 检测出源端存在不支持的外键引用操作 MySQL、GaussDB(for MySQL)为源的全量增量或增量迁移、同步场景,以及MySQL、GaussDB(for MySQL)为源灾备场景 表1 源端存在不支持的外键引用操作 预检查项 源端存在不支持的外键引用操作。 描述 同步对象中存在包含CASC…...
Linux 中的 cd 命令及示例
cd命令在Linux 中称为更改目录命令。它用于有效地从当前工作目录移动到系统中的不同目录。 Linux 中 `cd` 命令的语法 光盘[目录] cd [directory]在这里,将 [directory] 替换为您要导航到的目标目录的路径。 “cd”命令的实际实现与示例。...
【VUE】
概念 VUE是一个用于构建用户界面的渐进式框架 构建用户界面:基于数据渲染出用户看到的界面 渐进式:声明式渲染->组件系统->客户端路由->大规模状态管理->构建工具 框架:一套完整的项目解决方案 VUE使用方式: 1.…...

详解初阶数据结构之顺序表(SeqList)——单文件文件实现SeqList的增删查改
目录 一、线性表 二、顺序表 2.1概念及结构 2.2接口实现 2.3动态顺序表的创建 2.3动态顺序表的初始化 2.3.1传值初始化 2.3.2传址初始化 2.4动态顺序表的清空 2.5动态顺序表的扩容 2.6动态顺序表内容的打印 三、动态顺序表的使用 3.1尾插尾删 3.1.1尾插 3.1.2尾删…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战
在现代战争中,电磁频谱已成为继陆、海、空、天之后的 “第五维战场”,雷达作为电磁频谱领域的关键装备,其干扰与抗干扰能力的较量,直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器,凭借数字射…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...

Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...

uniapp手机号一键登录保姆级教程(包含前端和后端)
目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号(第三种)后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...

android RelativeLayout布局
<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:gravity&…...