DS:树及二叉树的相关概念

                                                 创作不易,兄弟们来波三连吧!! 

一、树的概念及结构

1.1 树的概念

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

1、有一个特殊的结点,称为根结点,根节点没有前驱结点
2、除根节点外,其余结点被分成M(M>0)个互不相交的集合T1、T2、……、Tm,其中每一个集合Ti(1<= i<= m)又是一棵结构与树类似的子树。每棵子树的根结点有且只有一个前驱,可以有0个或多个后继(每个孩子只能有一个父亲,每个父亲可以有多个孩子)
3、因此,树是递归定义的。(树可以分成2部分,1部分是父亲节点,1部分是N颗子树,如果子树不是叶子,那么子树可以继续分成父节点和子树

注意:树结构中,子树之间不能有交集,否则就不是树结构!!

1.2 树的相关名词

树的相关名词是依照树加上人类的亲缘关系表述的!

节点的度:一个节点含有的子树的个数称为该节点的度; 如上图: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)棵互不相交的树的集合称为森林;

以上标红的是博主认为比较重要的。

1.3 树的表示方法

      树的结构相比较于以往的其他结构就比较复杂了,要存储起来表示就比较有难度,不仅要保存值域,也要保存节点和节点之间的关系。

如果我们知道节点的度,那么我们就可以根据这个度来决定我们的结构体中需要有多少个孩子指针!!但是如果我们不知道节点的度,我们就有了以下方法来表示:

1.3.1 双亲表示法

实现:定义数组结构存放树的结点,每个结点含两个域:
数据域:存放结点本身数据信息。
双亲域:指示本结点的双亲结点在数组中的位置。(可以存放双亲的下标,也可以存放双亲的指针

      这样的存储结构,根据结点parent指针很容易找到它的双亲结点,所用时间复杂度为O(1),直到parent为-1时,找到了树的根结点,但是如果我们想要知道孩子的节点,那么唯一的方法就是遍历!!

特点:找双亲容易,找孩子难 

1.3.2 孩子表示法

具体办法是:把每个结点的孩子结点排列起来,看成是一个线性表,以单链表作存储结构,则n个结点有n个孩子链表(叶子结点的孩子链表为空),然后n个头指针又组成一个线性表,采用顺序存储结构,存放进一个一维数组中

特点:找孩子易,找双亲难

       这样的结构对于我们要查找某个结点的某个孩子,或者找某个结点的兄弟,只需要查找这个结点的孩子单链表即可。对于遍历整棵树也是很方便的,对头结点的数组循环即可。

1.3.3 孩子双亲表示法

就是把上面两种方法结合一下

即在链表表头再增加一个数据域存储双亲的下标,用空间换取方便! 

1.3.4 左孩子右兄弟表示法

但是我们用的最多的还是左孩子右兄弟法,因为相关的结构体只需要1个指向兄弟的指针,1个指向第一个孩子的指针,一个数据域就可以解决问题了!

typedef int DataType;
struct Node
{
struct Node* _firstChild1; // 第一个孩子结点
struct Node* _pNextBrother; // 指向其下一个兄弟结点
DataType _data; // 结点中的数据域
};

1.4 树在实际中的应用

就是文件系统中的目录树结构!!

     我们打开磁盘,在底层就是通过磁盘地孩子指针找到第一个孩子,然后再通过第一个孩子的兄弟指针开始逐个逐个遍历后面的兄弟节点,才能把整个目录给列举出来, 

    如果我们新建一个文件夹,就是让该文件目录下的兄弟节点指向NULL的文件指向这个新建文件,然后新建文件的兄弟指针指向NULL,当然这个也要看情况,有时候文件排序的方式也是不同的

二、二叉树的概念及结构

    实际中我们的树一般只用在这个目录树结构,而我们最常用的是树中的一个比较特殊的群体——二叉树

2.1 二叉树的概念

一棵二叉树是结点的一个有限集合,该集合:
1. 或者为空
2. 由一个根节点加上两棵别称为左子树和右子树的二叉树组成

二叉树的特点:

1、 二叉树不存在度大于2的节点

2、二叉树的左右子树不能颠倒

2.2 特殊的二叉树

1. 满二叉树:一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是
说,如果一个二叉树的层数为K,且结点总数是 ,则它就是满二叉树。
2. 完全二叉树:完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。 要注意的是满二叉树是一种特殊的完全二叉树。

2.3 二叉树的性质

1. 若规定根节点的层数为1,则一棵非空二叉树的第i层上最多有2^(i-1)个结点.

2. 若规定根节点的层数为1,则深度为h的二叉树的最大结点数是2^h-1


3. 对任何一棵二叉树, 如果度为0其叶结点个数为n0, 度为2的分支结点个数为n2 ,则有总是有n0=n2+1


4. 若规定根节点的层数为1,具有n个结点的满二叉树的深度,h=log(N+1)(ps: 是log以2
为底,n+1为对数)
5. 对于具有n个结点的完全二叉树,如果按照从上至下从左至右的数组顺序对所有节点从0开始编号,则对于序号为i的结点有:

1. 若i>0,i位置节点的双亲序号:(i-1)/2;i=0,i为根节点编号,无双亲节点
2. 若2i+1<n,左孩子序号:2i+1,2i+1>=n否则无左孩子
3. 若2i+2<n,右孩子序号:2i+2,2i+2>=n否则无右孩子

2.4  二叉树的存储方式

2.4.1 顺序存储

          顺序结构存储就是使用数组来存储,一般使用数组只适合表示完全二叉树,因为不是完全二叉树会有空间的浪费。而现实中使用中只有堆才会使用数组来存储,关于堆我们后面的章节会专门讲解。二叉树顺序存储在物理上是一个数组,在逻辑上是一颗二叉树。

一般来说,顺序存储只适用于完全二叉树!! 

2.4.2 链式存储

        二叉树的链式存储结构是指,用链表来表示一棵二叉树,即用链来指示元素的逻辑关系。 通常的方法是链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点左孩子和右孩子所在的链结点的存储地址 。链式结构又分为二叉链和三叉链。

先介绍到这里了!!

关于存储方式的详细介绍,后面会发布文章进行学习的

感谢支持!!

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

利用Cloudflare Workers实现网页状态监控

首先 Fork cf-workers-status-page 浏览器地址栏输入 https://deploy.workers.cloudflare.com/?urlhttps://github.com/$YourUserName/cf-workers-status-page 获取 Cloudflare 账户内的 Account ID 和 API Token 授权的 token 需要 workes 的编辑权限 在 Github actio…

LeetCode二叉树的垂序遍历

题目描述 给你二叉树的根结点 root &#xff0c;请你设计算法计算二叉树的 垂序遍历 序列。 对位于 (row, col) 的每个结点而言&#xff0c;其左右子结点分别位于 (row 1, col - 1) 和 (row 1, col 1) 。树的根结点位于 (0, 0) 。 二叉树的 垂序遍历 从最左边的列开始直到…

DolphinScheduler安装与配置

DolphinScheduler概述 Apache DolphinScheduler是一个分布式、易扩展的可视化DAG工作流任务调度平台。致力于解决数据处理流程中错综复杂的依赖关系&#xff0c;使调度系统在数据处理流程中开箱即用。 DolphinScheduler的主要角色如下&#xff1a; MasterServer采用分布式无…

CPython:表达式的求值顺序(evaluation order)

相关阅读 Pythonhttps://blog.csdn.net/weixin_45791458/category_12403403.html?spm1001.2014.3001.5482 C中表达式的求值 C语言针对表达式的计算&#xff0c;设置了操作符的优先级和结合性这两个特性&#xff0c;优先级用于解析不同优先级的符号&#xff0c;结合性用于解析…

【基础】第K大与第K小数

说明 给定一个长度为N(0< n< 10000)的序列&#xff0c;保证每一个序列中的数字a[i]是正整数 &#xff0c;编程要求求出整个序列中第k大的数字减去第k小的数字的值m&#xff0c;并判断m是否为质数。(0< k< n) 输入数据 第一行为2个数n&#xff0c;k&#xff08;…

【北邮鲁鹏老师计算机视觉课程笔记】10 Classification 分类

【北邮鲁鹏老师计算机视觉课程笔记】10 Classification 分类 1 图像识别的基本范式 检测问题&#xff1a;不仅要知道有没有&#xff0c;还要知道在哪里 分类是整图级标签&#xff0c;检测是区域级标签&#xff0c;分割是像素级标签 2 检测任务的应用 3 单实例识别与类别识别…

《Linux 简易速速上手小册》第3章: 文件系统与权限(2024 最新版)

文章目录 3.1 Linux 文件系统结构3.1.1 重点基础知识3.1.2 重点案例&#xff1a;设置一个 Web 服务器3.1.3 拓展案例 1&#xff1a;日志文件分析3.1.3 拓展案例 2&#xff1a;备份用户数据 3.2 理解文件权限3.2.1 重点基础知识3.2.2 重点案例&#xff1a;共享项目文件夹3.2.3 拓…

java学习08---面向对象

一 类和对象 1 类和对象的理解 客观存在的事物皆为对象 &#xff0c;所以我们也常常说万物皆对象。 类 简单理解&#xff1a;类就是对现实事物的一种描述 类是对象的数据类型&#xff0c;类是具有相同属性和行为的一组对象的集合 类是对现实生活中一类具有共同属性和行为的事…

Python教程56:海龟画图turtle画kitty猫

---------------turtle源码集合--------------- Python教程91&#xff1a;关于海龟画图&#xff0c;Turtle模块需要学习的知识点 Python教程51&#xff1a;海龟画图turtle画&#xff08;三角形、正方形、五边形、六边形、圆、同心圆、边切圆&#xff0c;五角星&#xff0c;椭…

【python量化交易】qteasy使用教程02 - 获取和管理金融数据

qteasy教程2 - 获取并管理金融数据 qteasy教程2 - 获取并管理金融数据开始前的准备工作获取基础数据以及价格数据下载交易日历和基础数据查看股票和指数的基础数据下载沪市股票数据从本地获取股价数据生成K线图 数据类型的查找定期下载数据到本地回顾总结 qteasy教程2 - 获取并…

【Web】CVE-2021-31805 s2-062漏洞复现学习

目录 Struts2介绍 漏洞概况 OGNL与Struts2 简单原理 漏洞复现 正向rce 反弹shell payload分析 Struts2介绍 Struts 2 是一个流行的用于构建 Java Web 应用程序的开源 Web 应用程序框架。它是 Apache 软件基金会下的一个顶级项目&#xff0c;是 Struts 框架的升级版本。…

docker磁盘不足!已解决~

目录 &#x1f35f;1.查看docker镜像目录 &#x1f9c2;2.停止docker服务 &#x1f953;3.创建新的目录 &#x1f32d;4.迁移目录 &#x1f37f;5.编辑迁移的目录 &#x1f95e;6.重新加载docker &#x1f354;7.检擦docker新目录 &#x1f373;8.删掉旧目录 1.查看doc…

衍生式设计之随机删除Revit幕墙网格

上次教程&#xff0c;我们创建了一个随机的三角形&#xff08;一个小例子&#xff0c;告诉你什么是衍生式设计&#xff09;&#xff0c;用来给大家简单介绍了下啥是衍生式设计&#xff0c;但是三角形是在Dynamo里做的&#xff0c;似乎和Revit没啥关系&#xff0c;那么本次呢&am…

【树莓派系统的位数】

要区分 ARM 架构下载的版本是 32 位还是 64 位&#xff0c;可以执行以下步骤&#xff1a; 执行以下命令来检查 Raspberry Pi 的 CPU 类型&#xff1a; uname -m如果返回的结果是 aarch64&#xff0c;则表示您的 Raspberry Pi 是 64 位的 ARM 架构。如果返回的结果是 armv7l&a…

Linux_文件系统

假定外部存储设备为磁盘&#xff0c;文件如果没有被使用&#xff0c;那么它静静躺在磁盘上&#xff0c;如果它被使用&#xff0c;则文件将被加载进内存中。故此&#xff0c;可以将文件分为内存文件和磁盘文件。 内存文件 磁盘文件 软、硬链接 一.内存文件 1.1 c语言的文件接口 …

小白学Halcon100例:如何获取物品中心坐标并展示

文章目录 *读入彩色图片*分解彩色图片为三通道*阈值分割*链接*选择特征*提取目标中心*绘制目标中心--*设置线宽为1*创建十字轮廓*清空窗体*设置绘制模式为绘制边缘*显示目标*显示目标中心*读入彩色图片

物联网技术讲解:蓝牙无线通讯技术

相信大家对蓝牙肯定不会陌生&#xff0c;但蓝牙是怎么来的&#xff1f;为什么叫蓝牙不叫黄牙呢&#xff1f;它是如何发展至今&#xff1f;以及它与物联网未来的发展趋势是什么&#xff0c;今天我们一起来深度的聊一聊。蓝牙无处不在&#xff1a;扬声器、无线耳机、汽车、可穿戴…

常见单例模式详解

单例模式是23种设计模式中应用最广的模式之一&#xff0c;其定义&#xff1a;确保某一个类只有一个实例&#xff0c;而且自行实实例化并向整个系统通过这个实例。其类图如下&#xff1a; 通俗来说&#xff0c;单例模式就是用于创建那些在软件系统中独一无二的对象。在一个软件系…

数据库从入门到精通(一)数据库基础操作

mysql数据库基础操作 cmd下启动mysql数据库操作命令数据库重要的删除操作数据库增删改查操作插入数据更新数据删除数据查询数据查询指定记录in查询满足指定范围之内的条件记录not in查询不在指定范围之内的条件记录带between and 的范围查询带like的字符匹配查询(d%以d开头,%d以…

建模语言CellML初步

文章目录 简介洛伦兹吸引子仿真 简介 CellML是主打计算生理学的一个编程语言&#xff0c;擅长处理微分方程问题&#xff0c;并且内置了单位系统&#xff0c;是细胞层次的建模工具。openCOR为其运行环境&#xff0c;提供了舒适的代码编辑窗口&#xff0c;以及一系列IDE工具&…