【树2】二叉树

---------注:本文所用的术语定义均来自国外大学和计算机文献使用的定义,非国内教材。层次编号从1开始-------------

二叉树简介

二叉树也是一种树,它特殊在:

1、每个结点的孩子最多只能是2,即二叉树中不存在度大于2的结点。

2、每个结点的孩子结点区分左孩子和又孩子,即便是只有1个孩子结点,也分左孩子和右孩子。

提示

1、二叉树是 rooted tree。即若二叉树非空,则必须指定,且固定有一个唯一的root结点。这话听起来很奇怪:只要树不为空,肯定有root结点啊?可是,一般情况下的树,他的每一个结点都可以当做root去看待,只不过我们脑袋里总把一棵树的图形固定去理解而已。但是二叉树的root结点必须是固定唯一,明确指出的。

 

2、二叉树是有序树(ordered tree)。这点对于啃过国内大学教材的朋友来说就很有争议。我的理解是:二叉树中的孩子是区分左右的,左右不应该和次序混为一谈,只不过二叉树在实现时,都是通过按有序的方式去完成的,即左孩子在右孩子的前面。

 

 

二叉树的性质

1、二叉树的许多性质都和2有关,确切的说是以2为公比,首项为1的等比数列有关。

2、二叉树的第i层上的节点数最多为 2i-1 个 (i>=1)           (类比数列的第i项

 

3、k层的二叉树至多有2k - 1个结点(k≥1)                     (当每层都达到做多结点时,达到最大值 。类比数列的前k项和

 

4、在任意一棵二叉树中,若外部(叶子)结点的个数为n0,度为2的结点数为n2,则有:n0=n2+1。
    要证明这个性质,就要从点和线的方面去分析。
    设:度为2的结点个数有n2个,度为1的结点有n1个,度为0  的叶子结点有n0个,树的总结点为N个。
         树的总的 边 的个数为E。
        
        ①  N = n2 + n1 + n0
        ②  E= N - 1                           # 除了root结点,其他结点都是由头顶上的一条边引出来的。
        ③  E= 2 * n2 + n1                    # 度为2的结点,必顶会向下引出2条边, 同理,度为1的结点会引出1条。

 

      结合3个式子消元得:n0 = n2 + 1

 

5、结点数固定时,层次数的范围:一个有n个结点的二叉树,其层次数L 满足不等式
 

解释:当这个二叉树是完全二叉树时,其层次数最小,当每一层仅有1个结点时,层次数最大。

 
6、 层次固定时为K时,结点数N的范围:
       K<= N  <= 2 k + 1
解释:当每一层仅有1个结点时,结点数最少为K,当它为一个完美二叉树时,结点数最多为   2 k + 1
 
7、当 层次固定时为K时,叶子结点数N 0的范围:
       1<=   N 0  <=2 (k-1)
解释:当每层只有1个结点时,叶子只有一个。当每层都满时,叶子数最多,如k层的完美二叉树,则叶子都在最后一层,有2 (k-1) 个。
 
8、当 层次固定时为K时,内部结点数N i的范围:
     k-1<=  N i  <=2 (k-1)  - 1

一般二叉树的存储实现

1、使用数组作为内部存储。
这种存储方法 只适合完全二叉树,如果是一般二叉树,会造成空间浪费。首先我们需要了解一下当对完全二叉树使用顺序存储时的细节。
若给完全二叉树的结点,从上到下,从左到右依次从0开始编号作为这个结点的索引,索引为i的结点,存储在数组下标为i的地方。则:
 
如果i==0,则它是root结点。
如果i >0 ,则他的父结点的索引为:
 
如果 2*(i+1) > n ,则它无左孩子。
       2*(i+1) <=n ,  则他的左孩子的索引为  2i +1
 
如果 2*(i+1)+1 >  n,则他无右孩子。
        2*(i+1)+1 <=  n,则它的右孩子的索引为 2i+2
 
可以发现,使用数组存储完全二叉树是非常高效的,因为结点之间的关系都暗含在索引之中了,无需额外的指针,且数组的随机访问速度也很快。
但是如一个一般二叉树要使用这种方法存储,就必须先填补“无效结点”使之成为为一个完全二叉树。
 

 

 上图可以看出,填充浪费一大半的数组空间,最坏空间复杂度为O(n 2)。 所以,一般二叉树不会使用顺序存储结构,除非是完全二叉树。
 
 
2、链式存储结构:适合用于存储一般形态的二叉树。链式存储更加通用。缺点是指针域占用的额外空间较多,存储率不高。

题目:采用这种设计时,若总结点数为N,则会有多少个空指针域? 答:N+2个。
因为N个结点的树,会有N-1个边,3N个指针域,而每一条边会“消灭”2个空指针域。则空指针域 = 3N-2(N-1) = N+2
 

 

 

有时候我们无需知道一个结点的父结点,则结点的设计可以去掉parent域。

题目:采用这种设计时,若总结点数为N,则会有多少个空指针域?答:N+1

因为N个结点的树,会有N-1个边,2N个指针域,而每一条边会“消灭”1个空指针域。则空指针域 = 2N-(N-1) = N+1

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值