二叉树与堆

1.树的概率

什么是树

树:树与前面的顺序表、单链表不一样,树是一个非线性结构,它可能存在着1对多的情况,不想线性表那样具有一对一的关系;
说简单点,我们可以想象一下生活中的树是啥样子的,我们数据结构里面的树就是啥样子的:

树的一些专业术语

既然我们已经简单了解了啥子是树,我们先来了解一下一些关于树的专业术语:

节点的度: 就是一个节点下面连接着几个节点,比如上图中的A连接着B、C、D这3个节点,那么A的度就是3;同理J的度就是0,它下面也没有链接其他节点嘛;
叶子节点: 也就是度为0的节点,比如J、K、L等都是叶子节点;
分支节点: 也就是度不为0的节点,比如上述的E、E、G、H;
双亲节点: 比如图中G节点,它的上一个节点是C与其直接相连,那么C节点就叫做G的双亲节点;
孩子节点: 还是G节点,刚才说了C是它的双亲节点,那么反过来站在C节点的角度,G节点就是C节点的孩子节点;孩子节点也就类似于这样关系;
兄弟节点: 就比如同一层节点都是彼此的兄弟节点,比如F的兄弟节点是E或者G、H;
树的度: 我们知道一颗树中每个节点都有自己的度,那么度最大的那个节点的度,就代表这整颗树的度;
节点的层次: 以根节点为第一层,其孩子节点为第二层依次类推;
树的高度: 通常我们把根节点作为高度为1来算,每增加一个层次,树的高度就增加1,空树的高度通常用0来表示(有的地方喜欢用-1来表示),比如上面这颗树的高度就是:4;
堂兄弟节点: 就比如F节点,E节点就是它的亲兄弟节点,G节点就是它的堂兄弟节点;
节点的祖先: 从根节点到到该节点,所经过的所有节点都是该节点的祖先;(根节点是所有节点的祖先);
子孙: 从当前节点到目标节点所经过的节点都是当前节点的子孙;(所有节点都是根节点的子孙);
森林: 多克不相交的树的集合叫做森林;

树的表示


由于树的每个节点的度不是相同,所以我们没办法想顺序表和单链表一样,设计它的数据结构;如果我们按照节点的度最大的方法来设计数据结构,那么我势必会造成空间浪费,但是我们如果不这样做的话,又不能完整的表示其连接关系和保存其数据,为此有大佬专门设计了一个NB的方案来解决这个问题:

该方法叫做孩子兄弟表示法
画个图示意一下:

通常情况我们用该节点的左指针域存该节点的第一个孩子,利用该节点的右指针域存储离其最近的亲兄弟注意!!!这里是说的亲兄弟,不是表兄弟!!!
有了这么个NB的设计那么树这种数据结构就能够很好的被计算机保存下来:
就比如下图:有了双面的结构,我们就可以对其转换

我们可以发现这是一颗度为2的树!!也就是我们耳熟能详的二叉树!!!
这样一来的话,我们不就很好的将上述数据存储在计算机当中了嘛!空间浪费也是比较小了!!同时这也说明了我们为什么要学习二叉树的原因了!!,通过上面的那个结构定义我们可以知道任何一颗树或者森林都能通过孩子兄弟表示法转换为一颗二叉树!!
由此可见当时提出这个设计的人是多么的牛!!!

二叉树的概念


上面再阐述结构设计的时候讲了我们为什么会着重讲解二叉树而不是三叉树、四叉树的一个重要原因;
还有一个原因就是利用二叉树存储的话我们可以将空间浪费降到最小!!

什么是二叉树

现实中的二叉树:

特殊的二叉树

满二叉树:一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是
说,如果一个二叉树的层数为K,且结点总数是 ,则它就是满二叉树。
比如下图:

完全二叉树: 完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。 要注意的是满二叉树是一种特殊的完全二叉树。
如下图:

要注意其连续性!!!

同时我们需要注意,满二叉树是一颗特殊的完全二叉树!!!

二叉树的性质


1、若规定根节点的层数是1,则第i层的节点数最多为2^(i-1)个(i>=1);
2、若规定根节点的层数是1,假设一颗树的深度为h,那么这颗树最多有2^h-1个节点;
3、对于任何一颗二叉树来说,假设其叶子节点的个数为n0,度为1的节点的个数为n1,度为2的节点个数为n2;那么总节点的个数为:n0+n1+n2;同时还有一条特别重要的结论:n0=n2+1;
4、若规定根节点的层数为1,具有n个结点的满二叉树的深度 log ⁡ ( N + 1 ) \log(N+1)log(N+1)(其中log ⁡ \loglog表示以2为底的对数);
5、对具有n个节点的完全二叉树,我们现在从根节点(根节点标为0)开始从左往右S形给每个节点标号!(标号范围0~N-1),那么假设一个节点的标号为i,则:
该节点的父亲节点为标号为:(i-1)/2的节点;
其左孩子节点为标号为:2*i+1的节点;

2.堆的概念


堆: 如果有一个关键码的集合K = { , , ,…, },把它的所有元素按完全二叉树的顺序存储方式存储
在一个一维数组中,并满足: <= 且 <= ( >= 且 >= ) i = 0,1,2…,则称为小堆(或大堆)。将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。
其中:
1、所有父节点的值都大于等于子节点的值,叫做大堆;
比如:

2、所有父节点的值都小于等于子节点的值,叫做小堆;
比如:

3、任何一个数组一定数完全二叉树,但是不一定是一个堆!

堆的表示方式

堆一般是用数组来表示的,但是也是有链式结构的表示方法的,但是我们今天只讲解数组实现的堆!!

其中上图的有侧部分才是我们堆在内存中的真实模样,右边只是我们想象出来的,方便我们人理解的!!所以它叫做逻辑图!!!数组才是其物理存储方式!!

堆的实现

堆作为一种数据结构,主要实现以下几个功能

刚才说了我们主要采用数组来实现堆,为此对其设计的数据结构为:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值