【大话数据结构】第六章总结——树(中)

目录

前言

二叉树

特殊二叉树:

二叉树的性质:

总结


前言

有一段时间没继续写《大话数据结构》了,说到底还是因为懒!

由于树的知识点太多了,所以我分三部分来总结,下面进入二叉树环节!!

(如果忘记之前的内容,可以点击右边直达【大话数据结构】第六章总结——树(上)

 

二叉树

在上一部分,最后提到了用孩子兄弟表示法可以形成一棵二叉树,那么什么是二叉树呢?先看图再看含义

这是一棵二叉树

 

这也是一棵二叉树

 

同理,这也是二叉树

从图上可以发现一个特点,二叉树中树的度最大为2,下面看一下二叉树的解释

 

二叉树:

二叉树(Binary Tree)是n(n ≥ 0)个结点的有限集合,该集合或者为空集(称为空二叉树),

或者由一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树的二叉树组成。

 

其实直接看解释或许有点懵,不过我们可以根据它的特点出发,帮助我们理解

二叉树的特点:

  • 每个结点最多有两棵子树,所以二叉树中不存在度大于2的结点。

    (注意不是只有两棵子树,而是最多有。没有子树或者有一棵子树都是可以的

  • 左子树和右子树是有顺序的,次序不能任意颠倒。
  • 即使树中某结点只有一棵子树,也要区分它是左子树还是右子树。例如下图中是两棵不同的二叉树

 

如果一棵二叉树由三个结点组成的话,那么这棵二叉树有几种形态呢?(建议先自己想一想,或者在纸上画一下再往下看)

就当你已经在大脑中想了一遍了,下面公布答案

 

总共有5种,不知道你是否答对了,答对的话继续往下看吧,答错或者答漏的话可以继续看看上图,应该不难理解。

 

特殊二叉树:

在数据结构中,总是会有一些特例,二叉树也不例外

 

斜树:

像上图中,所有结点都只有左子树的二叉树叫左斜树;所有结点都只有右子树的二叉树叫右斜树

左斜树跟右斜树统称为斜树。

它的特点就是每一层只有一个结点,类似线性表(线性表可以理解为树的一种极其特殊的表现形式)

 

满二叉树:

如上图所示,可以发现,这样的二叉树每个分支结点都存在左右子树(叶子除外),叶子呢都在同一层,这种二叉树称为满二叉树

 

满二叉树的特点有:

1. 叶子只出现在最下一层

2. 非叶子结点的度一定为2

3. 在同样深度的二叉树中,满二叉树结点个数最多,叶子数最多

 

完全二叉树:

 

上面这些都是完全二叉树,你没看错,第三张图也是完全二叉树。有人懵了,这不是满二叉树吗?

难点来了,“满”跟“完全”这两种类型的二叉树中,第二种是比较难理解的,先看一下比较官方的解释
 

对一棵具有n个结点的二叉树按层序编号,如果编号为i(1 ≤ i ≤ n)的结点与同样深度的满二叉树中编号为i的结点在二叉树中位置完全相同,则这棵二叉树称为完全二叉树

 

这上面的解释估计看晕了不少人,还是我来解释一下吧

完全二叉树呢,其实是建立在满二叉树的基础上的,具体而言就是在满二叉树右下角的地方开始往左边依次砍n个结点后形成的即为完全二叉树!看图理解吧

 

如上图所示,在满二叉树右下角往左边依次砍掉1个结点后,就变成了完全二叉树

 

同理,在满二叉树右下角往左边依次砍掉2个结点后,就变成了完全二叉树

 

当砍掉0个结点后,也是一棵完全二叉树,只是这时也是一棵满二叉树

(注意:从上图可以得知满二叉树一定是完全二叉树,但是完全二叉树不一定是满二叉树)

 

下面这些二叉树就不是完全二叉树了!

 

上图中,没有依次砍掉结点

 

上图中也是一样,如果要砍掉第三层(从上往下数第三层)的结点,那么一定要把第四层的结点都砍掉形成一棵满二叉树,才能砍第三层

即如下图所示才是完全二叉树

 

再次回忆一下完全二叉树吧

完全二叉树呢,其实是建立在满二叉树的基础上的,具体而言就是在满二叉树右下角的地方开始往左边依次砍n个结点后形成的即为完全二叉树!

记住几个关键点:满二叉树右下角开始依次往左

 

完全二叉树的特点:

1. 叶子结点只能出现在最下两层

2. 最下层的叶子一定集中在左部连续位置

3. 倒数二层,若有叶子结点,一定都在右部连续位置

4. 如果结点度为1,则该结点只有左孩子,即不存在只有右子树的情况

5. 同样结点数的二叉树,完全二叉树的深度最小

 

二叉树的性质:

1. 在二叉树的第i层上至多有2 ^ (i - 1)个结点(i ≥ 1)

2. 深度为k的二叉树至多有2 ^  k - 1个结点(k ≥ 1)

3. 对任何一棵二叉树T,如果其终端结点数为n0,度为2的结点数为n2,则n0 = n2 + 1

4. 具有n个结点的完全二叉树的深度为⌊log2n⌋ + 1(⌊x⌋表示不大于x的最大整数)

5. 如果对一棵有n个结点的完全二叉树(其深度为⌊log2n⌋ + 1)的结点按层序编号(从第1层到第⌊log2n⌋ + 1层,每层从左到右),对任一结点i(1 ≤ i ≤ n)有:

  • 如果i = 1,则结点i是二叉树的根,无双亲;如果i > 1,则其双亲是结点⌊i / 2⌋
  • 如果2i > n,则结点i无左孩子(结点i为叶子结点);否则其左孩子是结点2i
  • 如果2i + 1 > n,则结点i无右孩子;否则其右孩子是结点2i + 1

 

前4点性质中,其实不难理解,建议大家可以通过画图来证明以上性质,加深记忆。

第5点性质可能不好理解,我们以下图为例加以说明,下图是一棵完全二叉树,深度为4,结点总数为10

 

5.1 如果i = 1,则结点i是二叉树的根,无双亲;如果i > 1,则其双亲是结点⌊i / 2⌋

对于性质5的第一条来说,这是很显然的,因为i = 1时就是根结点。

i > 1时,比如结点5,那么它的双亲就是⌊i / 2⌋,也就是⌊5 / 2⌋ = 2,

结点9,它的双亲就是⌊i / 2⌋,也就是⌊9 / 2⌋ = 4

 

5.2 如果2i > n,则结点i无左孩子(结点i为叶子结点);否则其左孩子是结点2i

对于性质5的第二条来说,比如结点7,因为2 × 7 = 14超过结点总数10,所以结点7没有左孩子

同理,对于结点5,因为2 × 5 = 10等于结点总数10,所以它的左孩子是结点2i,也就是2 × 5 = 10结点

 

5.3 如果2i + 1 > n,则结点i无右孩子;否则其右孩子是结点2i + 1

对于性质5的第三条,比如结点5,因为2 × 5 + 1 = 11,大于结点总数10,所以它没有右孩子

同理,结点3,因为2 × 3 + 1 = 7,小于结点总数10,所以它的右孩子是结点7

 

总结

这就是《大话数据结构》第六章树的中篇啦,如果有不懂的地方,欢迎在下方留言评论。

一个人有了目标,如果因为懒惰而不去执行,那么这个目标很快就废了

就像写博客一样,如果一直保持一个月几篇博客,突然某个月因为懒而没有坚持写,那么就很难继续坚持下去了

所以为了避免出现这种情况,我得马上行动!不要给自己找那么多借口!坚持写博客,利己利他!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值