提示1:本篇使用Python实现算法代码
一、堆的前备知识
(一)树、二叉树介绍
1.树
树是一种数据结构,那么什么是树结构呢?
树结构好比你电脑的文件目录结构,其底层就是树结构的层级关系。
树也是一种可以递归定义的数据结构,树是由n个节点组成的集合:如果n=0,那这是一颗空树;如果n>0,那么存在一个节点作为树的根节点(下一段有介绍),其他节点可以分为m个集合,每个集合本身又是一颗树。为了能够理解这句话,我给出下面一张树的图,如图我们看,如果n=0,那么这棵树没有任何节点,则是一颗空树,如果n>0则A就是这整棵树的根节点,而诸如B、C、D、E等等,其余下部分本身又都是一棵树(如图二给出的部分示例)。
图一
图二
怎么看待树结构呢?
简单来说,树就是由许多个节点连接组成,且有相应的层级关系,类似于族谱,在最上面的“祖宗”我们称他为根节点,但在树结构中没有爷爷或者其他一说,节点和节点之间的关系只有父节点和子节点。这里我给出下面这张图,如图R是根节点,而a,b,c都是R的子节点,那么R就是a、b、c的父节点,同样的以下节点都有相应的相互关系。
接下来介绍关于树的几个概念:
叶子节点,为了能够更好的理解叶子节点,我们不如将图三中的树倒过来看,就像一颗树,树的最顶端最上面才是叶子,那么在树结构中也是同样的道理,最顶端的节点就是叶子节点,下图中的j、k、e、f、g、m、n、i均为叶子节点
树的深度(高度):很显然,树的深度就是树的层数,如下图树的深度为4。
树的度:在介绍树的度之前我想先介绍一下节点的度,什么是节点的度,简单来说就是这个节点有多少个子节点,例如图中的R有三个子节点,那么他的度为3,以此类推。那么什么是树的度呢,树的度就是这整颗树中所有节点中最大的那个度,下图中该树的度为3,因为R节点和c节点的度都为3且最大。
子树:关于子树,上面的图二中有很多示例,很简单,把根节点R看成树的下半部分,从他的子节点开始当做树的树枝部分,你每掰下一串树枝都可以成为这棵树的子树。
图三
2.二叉树
二叉树基本介绍:
1.二叉树为度不超过2的树
2.树的每个节点最多有两个子节点(根据上面树的介绍其实和第一点是一个道理)
3.两个子节点被区分为左子结点和右子节点
了解完二叉树的基本性质之后,完成堆排序我们需要了解以下几种二叉树:
第一种:满二叉树,一个二叉树,如果每一层的节点数都达到最大值,则这个二叉树就是满二叉树。
图四 满二叉树
第二种:完全二叉树,叶子节点只能出现在最下层和次下层,并且最下层的节点都集中在该层最左边的若干位置的二叉树。
图五 完全二叉树
第三种:非完全二叉树,根据完全二叉树的定义,不满足其定义的二叉树就是非完全二叉树,如下图中的二叉树均不是完全二叉树,因为其某些叶子节点不在该层的最左边位置。
图六 非完全二叉树
若还不能理解,下面给出一篇优秀博客,详尽的介绍了树以及二叉树的相关概念。
树、二叉树、完全二叉树、满二叉树的概念和性质-优快云博客https://blog.youkuaiyun.com/weixin_57675461/article/details/121323091
3.练习
给出下面几张树的图片,请判断其为什么二叉树(结尾附答案)
图七 某树