【数据结构初阶】二叉树的基本概念

⭐博客主页:️CS semi主页
⭐欢迎关注:点赞收藏+留言
⭐系列专栏:数据结构初阶
⭐代码仓库:Data Structure
家人们更新不易,你们的点赞和关注对我而言十分重要,友友们麻烦多多点赞+关注,你们的支持是我创作最大的动力,欢迎友友们私信提问,家人们不要忘记点赞收藏+关注哦!!!


前言

如下图,这是一个二叉树,看起来实在是太巧妙了,可是计算机内部真正存在这样的结构吗?我们继续往下看。
在这里插入图片描述


一、树的相关概念

在这里插入图片描述
这里有一个概念:任何一棵树都是由根和子树构成。但怎么样才能是结束条件呢?那就是到图中的P和Q了,那我们定义P和Q这样没有子树的结点叫做叶子结点。

(一)节点的度

一个节点含有的子树的个数称为该节点的度; 如上图:A的为6。也就是一个节点下数在同一层的节点个数即为该结点的度。

(二)叶节点或终端节点

度为0的节点称为叶节点; 如上图:B、C、H、I、P、Q、K、L、M、N节点为叶节点,也就是下面没有节点连接的结点叫叶结点。

(三)非终端节点或分支节点

度不为0的节点; 如上图:D、E、F、G…等节点为分支节点。

(四)双亲节点或父节点

若一个节点的下面连着其他结点,则这个节点称为其连着的节点的父节点; 如上图:A是B的父节点。

(五)孩子节点或子节点

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

(六)兄弟节点

具有相同父节点的几个结点(同级)称为兄弟结点。如图:B、C为兄弟结点。

(七)树的度

一棵树中,最大的结点的度称为整个数的度。如图,这个树的度为6。

(八)节点的层次

从根开始算起,根是第一层,根的子节点为第二层,以此类推。为什么要这样定义呢?原因在于会有空树的情况,空树表示为层次为零,而如果我们将有子树的数的根定义为0,那么空树为-1,很别扭,所以子树的根定义为1。

(九)树的高度或深度

树中节点的最大层次; 如上图:树的高度为4,也就是从根节点为1算起,往下数总共的层数。

(十)堂兄弟节点

双亲在同一层的节点互为堂兄弟,但不能是同一父节点。如上图:H、I互为兄弟节点。

(十一)节点的祖先

从根到该节点所经分支上的所有节点;如上图:A是所有节点的祖先。

(十二)子孙

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

(十三)森林

可以形象地理解成由大于0的树且不想交的树组合而成的叫森林。
在这里插入图片描述


二、树与非树

在这里插入图片描述
子树是不能相交的,为什么呢?因为我们看一下最左边的树,C与D连在一起,我们知道,C与D如果都是A的子树,那么C和D应该是兄弟结点,那么他俩不能串在一起吧!?那我们再看看中间的这课树,C去碰了B的孩子?太奇怪了,不符合逻辑。最右边的树也是如此。

三、树的表示

树的表示似乎很难去表示,因为计算机内部不是树形的结构,是个抽象的图形,我们如果想要模拟出树的形状和构造,就需要我们进行结构体的创建,我们试一试第一种做法,也就是结构体指针数组(孩子表示法)的做法,发现实在是太不方便了,我要想找子树也太难了,我们使用孩子双亲等的表示方法,发现很难的一点是太难进行搜索了,所以我们就简单的了解其中最常用的孩子兄弟表示法。什么是左孩子右兄弟表示法,我们看接下来:
在这里插入图片描述
在这里插入图片描述

左孩子,我们只看大孩子(左边的孩子)以及兄弟节点,为什么可以这样?我们可以这么理解,大孩子可以带小孩子,也就是D的右边是兄弟结点,下面F为大孩子结点,是不是就更好理解了!

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

四、二叉树的概念及结构

(一)概念

一棵二叉树是结点的一个有限集合,该集合:

  1. 或者为空
  2. 由一个根节点加上两棵别称为左子树和右子树的二叉树组成

在这里插入图片描述
注意:

  1. 二叉树不存在度大于2的结点
  2. 二叉树的子树有左右之分,次序不能颠倒,因此二叉树是有序树

在这里插入图片描述


(二)特殊二叉树

1、满二叉树

在这里插入图片描述
满二叉树即每一层都是满的,也就是说每一层的结点数都是达到最大值,那我们以层数为K举例,来算一算结点总数:

在这里插入图片描述

2、完全二叉树

在这里插入图片描述
前k-1层必须是满的,最后一层要求从左到右是连续的!它是特殊的满二叉树。
在这里插入图片描述


(三)二叉树的性质

1、度为0与度为2的关系

对任何一棵二叉树, 如果度为0其叶结点个数为n0 , 度为2的分支结点个数为n2 ,则有n0=n2+1。
这个结论实在是太好用了!!!
在这里插入图片描述

2、一层根节点,第i层结点数

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

3、一层根节点,高度为h的节点数

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

4、一层根节点,有n个结点满二叉树的深度

若规定根节点的层数为1,具有n个结点的满二叉树的深度,h= log2(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否则无右孩子

6、练习题

在这里插入图片描述
n0=n2+1=200那就选B。

在这里插入图片描述这是个常理,只有完全二叉树才可以使用顺序存储结构,所以此题选A。

在这里插入图片描述
假设度为0的为n0,度为1的为n1,度为2的为n2。
2n=N0+N1+N2
2n=N0+N1+N0-1
完全二叉树的度为1的只有1和0两种情况,而N0和N1一定是整数,所以推导出N1为1,所以:
2n=2N0-1+1
2n=2N0
所以N0=n
故选A。

在这里插入图片描述
在这里插入图片描述
那就是10咯,选择B答案。

在这里插入图片描述
假设度为0的为n0,度为1的为n1,度为2的为n2。
767=N0+N1+N2
767=N0+N1+N0-1
完全二叉树的度为1的只有1和0两种情况,而N0和N1一定是整数,所以推导出N1为0,所以:
N0=384,答案直接选B。


(四)二叉树的结构

1、二叉树的顺序结构

在这里插入图片描述顺序结构存储就是使用数组来存储,一般使用数组只适合表示完全二叉树,因为不是完全二叉树会有空间的浪费。二叉树顺序存储在物理上是一个数组,在逻辑上是一颗二叉树。

2、二叉树的链式结构

在这里插入图片描述

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

3、练习题

在这里插入图片描述简简单单画个图,看满不满足堆的条件,发现只有A满足条件。
在这里插入图片描述
在这里插入图片描述在这里插入图片描述所以选C。

在这里插入图片描述在这里插入图片描述这道题的关键在于先判断第一个非叶子子树调整成大堆,然后再往前调整,再调整根部,故答案选择C。

在这里插入图片描述
在这里插入图片描述要删除元素必先交换元素,然后向下调整即可,所以选C。


总结

我们在此篇介绍了简单的二叉树的概念,我们知道了二叉树双亲结点与孩子节点的关系以及关于二叉树的基本概念,那当然了,后续还有很多实现结构的代码以及排序等问题,一步一个脚印。

家人们不要忘记点赞收藏+关注哦!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

The.Matrix.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值