一起学数据结构(7)——树及二叉树的基本概念及存储

2023-09-20 17:06:38

前面的关于数据结构的文章中,介绍了顺序表,链表,栈,队列等数据结构。对于以上数据结构,均是一对一的关系。本篇文章将对于一对多的数据结构——树进行解析。

目录

1. 树的定义及基本概念:

1.1 树的定义:

1.2 树的基本概念及术语:

2. 树的存储:

3. 二叉树的概念及结构 :

3.1 二叉树的概念:

3.2 两种特殊的二叉树:

3.2.1 满二叉树:

3.2.2 完全二叉树:

3.3 二叉树的存储:

3.3.1 完全二叉树的存储:

3.3.2堆的相关概念:

3.3.3 非完全二叉树的存储:


1. 树的定义及基本概念:

1.1 树的定义:

树是n(n\geq 0)个结点的有限集,当n =0时,把树称之为空树。对于任意的非空树,应该满足下面的条件:

1. 有且仅有一个特定的结点

2.当n> 1时,除根结点之外的其他结点可以再分为m(m> 0)个互不相交的有限集T_{1},T_{2},T_{3}......T_{n},并且每个有限集本身也可以看作一棵树,并且称之为根的子树。

树的结构可以由下图表示:


从给出的树的结构图可以看出,树的定义是满足递归的,即:树在定义的过程中,多次用到了自身。所以,树是一种递归的数据结构,同时,满足下面的两个特点:

(1).根结点没有前驱,除根结点以外的结点有且仅有一个前驱。如果对上述树的结构图进行更改:

本图中L结点因为由两个前驱,即E,F结点。所以,上图不满足树的结构,不为树。

(2).树中所有结点都可以又零个或者多个后继结点。 

1.2 树的基本概念及术语:

(1).结点的度:一个结点含有子树的个数,被称之为该结点的度,图中,A结点的度为3

(2).叶结点或终端结点:度为0的结点称之为叶结点,图中G,I,J均为叶结点。

(3).非终端结点或分支结点:度不为0的结点为分支结点。图中B,C,D,E均为分支结点。

(4).双亲结点或者父结点:若一个结点含有一个子结点,则这个结点称为子结点的父结点。

(5).子结点:一个结点含有的子树的根结点,称之为该结点的子结点,图中B,C,D均为结点A的子结点。

(6).兄弟结点:具有相同父结点的结点,称之为兄弟结点。

(7).树的度:树中最大的结点的度,称之为树的度。图中树的度为3.

(8).结点的层次:从根结点开始定义,根结点为第1层,以此类推。

(9).树的高度:树中最大的结点的层次,图中树的高度为4

(10).堂兄弟结点:父结点在同一层的结点,称之为堂兄弟结点,图中F,G,就互为堂兄弟结点。

(11).结点的祖先:从根到该结点所经分支的所有结点。例如,图中的祖先结点为A

(12).子孙结点:以某结点为根的子树中任一结点都为该结点的子孙结点。

(13).森林:m(m>0)棵互不相交的树构成的集合称之为森林。

2. 树的存储:

在存储上述给出的树时,由于每一个结点下面的子结点的数量都是随机的,所以,只有在得知结点的度的情况下,才可以提前开辟一定量的空间进行存储。但是在大多数情况下,结点的度都是未知的,对于上述情况,采取的存储方式为左孩子,右兄弟的存储方法,具体结构如下:

struct TreeNode
{
     int val;
     struct TreeNode* firstchild;
     struct TreeNode* nextbrother;
};

其中,val用于存储数据元素,结构体指针firstchild用于指向该结点最靠左部分的子结点,nextbrother用于指向子结点的兄弟结点。

若用上面的存储方法来表示给出的树的结构,其中红线表示结构体指针firstchild的指向,蓝线表示结构体指针nextbrother的指向,效果图如下:

对于由m(m>0)棵互不相交的树构成的森林,也可以采用双亲表示法进行存储,原理如下:

在采用双亲表示法对上述的森林进行存储时,需要创建一定大小的数组,用于存放若干个结构体,每个结构体均是森林中子树的结点,即:

在上一个存储方法中,分别存储了子结点和兄弟结点的地址。对于双亲表示法,则是存储该结点父结点的指针或者下标。 例如上面给出的数组,若该结点不存在父结点,则直接存储-1,若存在父结点,需要存储父结点的下标,效果如下:

其中,绿色数字代表该结点的父结点的下标。

从上面对于树的简单介绍可以看出,相对于之前的顺序表,链表等数据结构来说,树的结构较为复杂。但是,在实际使用时,只有二叉树这一种特殊的结构比较泛用,下面将对于二叉树的内容进行介绍。

3. 二叉树的概念及结构 :

3.1 二叉树的概念:

二叉树是一种特殊的数据结构,特点是每个结点至多只有两棵子树,即:二叉树中不存在度大于2的结点。并且二叉树有左右之分,且顺序不可以颠倒。

与树相同,二叉树也是由n(n\geq 0)个结点构成的有限集合。当n=1时,此时的二叉树被称之为空树。n = 1时,此时二叉树只有一个根节点。当n = 2时,此时的二叉树有左树、右树两种形式。当n=3是,此时的二叉树有左、右两棵子树。即:

n > 3的任意二叉树,均可以看作由上述情况复合而来。

3.2 两种特殊的二叉树:

3.2.1 满二叉树:

对于一个二叉树,如果每一层的结点数都到达了最大值,则称这个二叉树为满二叉树,满二叉树结构如下:


对于一个高度为n的满二叉树,由于每一层的结点都达到了最大值,满二叉树中的结点总数为2^n-1

3.2.2 完全二叉树:

对于完全二叉树,是一种效率很高的数据结构,完全二叉树是由满二叉树引出来的。对于一个高度为n,有m个结点的二叉树,当且仅当每一个结点都与高度为n的满二叉树编号从1n的结点一一对应时,称之为完全二叉树。对于满二叉树,可以看作成一种特殊的完全二叉树。也可以理解为,一个高度为m的完全二叉树,其前m-1层的结点数都达到了最大值。但是在第m层,结点的数量可以小于最大值,但是结点的排列必须是连续的,即下图中所展示的结构。:

而对于下面这种结点排列不连续的二叉树,则不可以看作完全二叉树:

前面说到,满二叉树可以看作一个特殊的完全二叉树。故,一个完全二叉树的结点数量的最大值为2^n-1。通过上述给出的完全二叉树的结构,可以的出,当完全二叉树结点数量的最小值,就是第m层只有一个结点,结构如下:

此时的完全二叉树的结点数量为2^{n-1}.所以,完全二叉树的结点数量的范围k为:                  

                                                           2^{n-1}\leq k\leq 2^{n}-1 

3.3 二叉树的存储:

3.3.1 完全二叉树的存储:

对于一个完全二叉树,在进行存储时,可以采用顺序存储的方式进行存储,例如对于下列完全二叉树:

其顺序存储方式可以表示为:

通过数组的下标,可以总结出下面的等式:

对于每个父结点,其左子结点的下标为child = parent*2+1。其右子结点的下标为:child = parent*2+2。对于每个子结点,其父结点的下标可以表示为:parent = (child-1)/2,左、右子结点均通用。

3.3.2堆的相关概念:

对于完全二叉树的顺序存储,一个比较典型的例子就是堆:堆是一个非线性结构的数据结构,结构上满足完全二叉树,适合用顺序存储。堆可以分为两种:

(1).小堆:树中任何一个父节点存储的值都\leq子结点存储的值。

顺序存储可以表示为:

(2).大堆:树中任何一个父结点存储的值都\geq子结点存储的值。例如:

3.3.3 非完全二叉树的存储:

将上面给出的完全二叉树删除其中的几个结点,改造成非完全二叉树。如果用顺序存储方式来存储非完全二叉树,则其顺序存储方式可以表示为:

 

对应非完全二叉树的结构为:

对于给出的非二叉树,将不再适用于上面给出的两个等式。这是因为,当在计算机中建立上述非完全二叉树时,二叉树的结构与图中表示不同,而是把F看作B的一个子结点,而非C的子结点。也就是说,F的下标应该是4E的坐标为3,与顺序表示方法中的下标编号不同。故不能采用顺序存储。

对于非完全二叉树的存储,一般采用链式存储。


 

                             

                                                             

更多推荐

前端面试合集(三——浏览器)

浏览器的页面渲染1.浏览器是如何渲染页面的?2.什么是reflow(重排)?3.什么是repaint(重绘)?4.为什么transform效率高?1.浏览器是如何渲染页面的?当浏览器的网络线程收到HTML文档之后,会产生一个渲染任务,并将其传递给渲染主线程的消息队列。在事件循环机制的作用下,渲染主线程取出消息队列中的渲

005-第一代光电小工具(一)

第一代光电小工具(一)文章目录第一代光电小工具(一)项目介绍大致原理描述核心控件QCustomPlot关于QCustomPlot播放音频软件截图关键字:Qt、Qml、QCustomPlot、曲线、SQLite项目介绍欢迎来到我们的QML&C++项目!这个项目结合了QML(QtMeta-ObjectLanguage)和C

Pluma 插件管理框架

1.概述Pluma是一个用C++开发的可用于管理插件的开源架构,其官网地址为:http://pluma-framework.sourceforge.net/。该架构是个轻量级架构,非常易于理解。Pluma架构有以下基本概念:1)插件的外在行为体现为一个纯虚类,可以叫作插件接口;2)继承于同一个插件接口的若干派生类,被认

异地远程访问本地SQL Server数据库【无公网IP内网穿透】

文章目录1.前言2.SeaFile云盘设置2.1Owncould的安装环境设置2.2SeaFile下载安装2.3SeaFile的配置3.cpolar内网穿透3.1Cpolar下载安装3.2Cpolar的注册3.3Cpolar云端设置3.4Cpolar本地设置4.公网访问测试5.结语1.前言现在我们身边的只能设备越来越多

工作、生活常用免费api接口大全

手机号码归属地:提供三大运营商的手机号码归属地查询。全国快递物流查询:1.提供包括申通、顺丰、圆通、韵达、中通、汇通等600+快递公司在内的快递物流单号查询。2.与官网实时同步更新。3.自动识别快递公司。IP归属地-IPv4区县级:根据IP地址查询归属地信息,包含43亿全量IPv4,支持到中国地区(不含港台地区)区县级

弹跳小球-第15届蓝桥杯第一次STEMA测评Scratch真题精选

[导读]:超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成,后续会不定期解读蓝桥杯真题,这是Scratch蓝桥杯真题解析第152讲。第15届蓝桥杯第1次STEMA测评已于2023年8月20日落下帷幕,编程题一共有6题,分别如下:行走的螃蟹飞驰的高铁旋转的正方体弹跳小球比较身高数据计算弹跳小球,本题是202

每天一道大厂SQL题【Day26】脉脉真题实战(二)活跃时长的均值

文章目录每天一道大厂SQL题【Day26】脉脉真题实战(二)活跃时长的均值每日语录第26题中级题:活跃时长的均值1.需求列表思路分析答案获取加技术群讨论附表文末SQL小技巧后记每天一道大厂SQL题【Day26】脉脉真题实战(二)活跃时长的均值大家好,我是Maynor。相信大家和我一样,都有一个大厂梦,作为一名资深大数据

测试用例设计底层逻辑

【软件测试行业现状】2023年了你还敢学软件测试?未来已寄..测试人该何去何从?【自动化测试、测试开发、性能测试】测试用例是每位测试人员都绕不开的话题,也是大家习以为常的事情。几乎所有测试相关的公众号、博客、专栏,都会提及测试用例,由此可见它的重要性。但是,有许多从业者,对测试用例的设计仍然依靠经验积累,即使知道用例要

持安科技孙维伯:零信任理念下的实战攻防:ISC2023数字小镇演讲

近日,在ISC2023第十一届互联网安全大会上,持安科技联合创始人孙维伯作为零信任办公安全赛道代表,亮相数字小镇New50,并发表《全方位防御:零信任理念下的实战攻防》主题演讲。以下是本次演讲实录:这几年,网络安全已经从监管合规趋向于实战化,网络诈骗、黑产越发猖獗,企业面临的安全挑战愈加严峻。在实战攻防的场景下,攻防双

Nginx 服务器 SSL 证书安装部署

操作场景本文档指导您如何在Nginx服务器中安装SSL证书。说明本文档以证书名称xxx为例。Nginx版本以nginx/1.18.0为例。当前服务器的操作系统为CentOS7,由于操作系统的版本不同,详细操作步骤略有区别。安装SSL证书前,请您在Nginx服务器上开启HTTPS默认端口443,避免证书安装后无法启用HT

2、从“键鼠套装”到“全键盘游戏化”审核

1、风行内容仓的增效之路-前言内容仓成立初期,安全审核组是规模最大的小组,占到部门人数的半壁江山,因此增效工作首先就从安全审核开始。早期安全审核每天的达标值在800条左右,每天的总审核量不到1万,距离业务部门期望的数量差距较大。我找到相关同事,讨论如何提高每天的审核产出,同事反馈说,感觉没有什么方法,部门内部已经做过测

热文推荐