【数据结构-初阶】二叉树(1)---树的相关概念

【数据结构-初阶】二叉树(1)---树的相关概念

🎈主页传送门:良木生香

🔥个人专栏:《C语言》 《数据结构-初阶》 《程序设计》

🌟人为善,福随未至,祸已远行;人为恶,祸虽未至,福已远离

上期回顾:在上一篇文章中(这是文章链接:【数据结构-初阶】详解线性表(5)---队列),我们学习了初阶数据结构中的后一个线性表---队列,那么在初阶线性结构中线性表的内容我们就告一段落了,今天我们就进入到初阶段数据结构中的非线性表这块知识的学习.在这块知识中,我们会学习到树,但是还不学习图,这会等到我们学习C++语言的时候详细讲解

目录

一、树的相关概念

1.树的概念与结构:

2、树的相关术语

3、树的表示方法

4、树形结构在生活中的具体应用:


 

在学习二叉树之前,我们要先了解一下什么是树

一、树的相关概念

讲到树,我们就能联想到平时生活中所看到的植物树,那我们今天要讲的树与平时看到的树有联系吗?有的兄弟,当然有,我们今天要将的树灵感就是来源于生活中的树

生活中的树根是在地下的,分支是朝天上生长的,所以我们说树是向阳而生的,而我们今天要讲的树长这样:

1.树的概念与结构:

树是一种非线性的数据结构,与前面讲的线性表不同,它是由n(n>=0)个有限节点组成一个具有层次关系的集合.我们将其称之为树是因为它看起来像是一颗倒挂的树,也就是说根是朝上的,叶子结点是朝下的.
  • 它有一个特殊的节点,叫做根节点,这个节点是没有前驱节点的
  • 除了根节点之外,剩下的其他节点被分成M(M>0)个互不相交的集合,T1,T2,T3.....Tm.其中一个集合Ti(1<Ti<M)又是一颗结构与树类似的子树.每棵子树的根节点有且只会有一个前驱,可以有0个或者多个后驱,因此,树是递归定义的.
小贴士:树形结构中,子树不能有交集,否则不是树形结构

非树形结构的像下面这样:

  • 标有问号的就是子树中有交集的,这样就不是树形结构了,如果相交了,那就是图,不是树了
  • 除了根节点之外,其他节点有且仅有一个父节点
  • 一颗N节点的树有N-1条边

 

2、树的相关术语

介绍树的相关术语,我们就拿下面这张图做例子:

父节点/双亲节点:若一个节点含有子节点,那么这个节点成为其子节点的父节点;像上图中,A是B的父节点;

子节点/孩子节点:一个结点含有的子树的根节点成为该节点的子结点;像上图中,B是A的子结点/孩子节点

结点的度:一个结点有几个孩子,那他的度就是多少;比如A的度是6,F的度是2的等等...

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

叶子结点/终端结点:度为0的结点成为叶结点,如上图:B、C、H、I...等等

分支结点/非终端结点:度不为0的结点,像上图中的D、E、F、G...

兄弟结点:具有相同父结点的结点互相称为兄弟结点(亲兄弟),像上图中的B、C是兄弟结点

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

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

结点的祖先:从根到该结点所经分支上的所有结点;像上图中,A是所有节点的祖先;

路径:一条从树任意结点出发,沿父结点-子结点连接,达到任意结点的序列;比如A到Q的路径为:A-E-J-Q;H到Q的路径为:H-D-A-E-J-Q

子孙:以某个结点为根的子树中任以结点都称为该节点的子孙.像上图中:所有节点都是A的子孙;

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

 

3、树的表示方法

树结构相对线性表就⽐较复杂了,要存储表⽰起来就⽐较⿇烦了,既然保存值域,也要保存结点和结 点之间的关系,实际中树有很多种表⽰⽅式如:双亲表⽰法,孩⼦表⽰法、孩⼦双亲表⽰法以及孩⼦兄弟表⽰法等。

在这么多方法里面,我们应该怎么选择哪个方法作为我们讲解的方法呢?我们选择孩子兄弟表示法,这也是前辈们在最初探索树的时候想出来的,因为这种方法比较容易我们理解

下面是树的结构体:

struct TreeNode { struct Node* child; // 左边开始的第⼀个孩⼦结点 struct Node* brother; // 指向其右边的下⼀个兄弟结点 int data; // 结点中的数据域 };

怎么理解这个结构体呢?不着急,请看下图:

我们以这个图为例,那么这棵树在结构体中的具象化就应该是这样子的:

 

4、树形结构在生活中的具体应用:

树形结构在生活中有许多的应用,拿个最简单的例子来说,就像我们电脑上的文件管理器,就是树形结构的应用,文件管理都是一层一层向下管理的:

以上就是我对树的概念内容的分享了,感谢大佬们的阅读~~~~

 

文章是自己写的哈,有什么描述不对的、不恰当的地方,恳请大佬指正,看到后会第一时间修改,感谢您的阅读.

Read more

使用 Rufus 制作启动盘安装 Windows 与 Ubuntu 系统全流程教程(图文详解+避坑指南)

适用对象:电脑小白、系统维护人员、装机爱好者 适用系统:Windows 10/11、Ubuntu、Deepin、Kali Linux 等 作者:顶云爱好者 更新时间:2025 年 10 月 文章目录  一、前言:为什么选择 Rufus?  二、准备工作  三、下载与启动 Rufus  四、使用 Rufus 制作启动盘  1. 制作 Windows 安装启动盘 ① 选择镜像文件 ② 选择分区方案 ③ 文件系统 ④ 点击 “开始(Start)”  2. 制作 Ubuntu 启动盘 ① 下载镜像 ② 打开

By Ne0inhk
鸿蒙APP开发从入门到精通:鸿蒙电商购物车全栈项目——订单管理、支付管理、AI原生

鸿蒙APP开发从入门到精通:鸿蒙电商购物车全栈项目——订单管理、支付管理、AI原生

《鸿蒙APP开发从入门到精通》第14篇:鸿蒙电商购物车全栈项目——订单管理、支付管理、AI原生 📱💳🤖 内容承接与核心价值 这是《鸿蒙APP开发从入门到精通》的第14篇——订单管理、支付管理、AI原生篇,100%承接第13篇的「用户管理、商品列表、购物车」项目架构,完成鸿蒙电商购物车全栈项目的核心业务功能实现。 学习目标: * 掌握订单管理的设计与实现; * 实现创建订单、查看订单、取消订单; * 理解支付管理的设计与实现; * 实现微信支付、支付宝支付; * 掌握AI原生的设计与实现; * 实现AI搜索、AI推荐、AI客服; * 优化订单管理、支付管理、AI原生的用户体验(响应速度、数据安全、用户反馈)。 学习重点: * 鸿蒙APP订单管理的开发流程; * 订单管理的分类与使用场景; * 支付管理的设计与实现; * AI原生的设计与实现。 一、 订单管理基础 🎯 1.1 订单管理定义 订单管理是指对应用的订单进行管理,主要包括以下方面:

By Ne0inhk
Flutter for OpenHarmony: Flutter 三方库 shamsi_date 助力鸿蒙应用精准适配波斯历法(中东出海必备)

Flutter for OpenHarmony: Flutter 三方库 shamsi_date 助力鸿蒙应用精准适配波斯历法(中东出海必备)

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net 前言 在进行 OpenHarmony 的全球化(Internationalization)应用开发时,进军中东市场(尤其是波斯语地区)是一项充满潜力的战略。但在这些地区,用户习惯使用的并非公历(Gregorian),而是 波斯历(Shamsi/Jalali)。 1. 如何将用户的生日从公历转换成波斯历? 2. 鸿蒙应用的时间轴、日历选择器如何呈现 Jalali 格式? 3. 业务系统中的合同到期日如何按波斯历进行逻辑计算? shamsi_date 是 Dart 生态中处理波斯历法的权威库。它提供了极其简单的转换 API,是你开发鸿蒙出海应用、打入中东市场的关键技术补丁。 一、历法转换算法模型 shamsi_date 实现了公历与波斯历之间的双向精准映射。 Conversion Conversion 公历 (2024-02-20) 波斯历 (1402-12-01)

By Ne0inhk
Ubuntu 24.04 在线安装 Redis 8.x 完整教程

Ubuntu 24.04 在线安装 Redis 8.x 完整教程

✅ Ubuntu 24.04 在线安装 Redis 8.x 完整教程 ✅ 教程说明 ✅ 适配 Ubuntu 24.04 LTS 系统,全程在线安装,最终稳定得到 Redis 8.x 版本(如你的 8.4.0) ✅ 解决版本混淆/安装失败问题,所有命令可直接复制执行,新手友好 ✅ 包含「安装+验证+远程访问配置+防火墙放行+运维命令」全套流程,无额外冗余步骤 📌 一、前置环境准备(更新系统+安装依赖) 先更新系统包索引,安装添加官方源必需的工具,避免后续步骤依赖报错,执行一次即可: # 更新系统软件源+升级已安装包,-y 自动确认所有操作sudoapt update

By Ne0inhk