数据结构与算法(十一)——二叉树的相关概念

目录

一、前情提要

二、二叉树的定义

三、特殊的二叉树

    (一)斜树

    (二)满二叉树

    (三)完全二叉树

四、二叉树的性质

性质1:在二叉树的第i层至多有2^(i-1)个结点。

性质2:深度为k的二叉树最多有2^k-1个结点。

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

性质4:具有n个结点的完全二叉树的深度为[log(n)]+1。对数以2为底,并下取整。

性质5:如果对一棵有n个结点的完全二叉树(其深度为[log(n)]+1(对数以2为底,并下取整。))的结点按层序编号(从第1层到第[log(n)]+1层,每层从左到右),对任一结点i有三个特点。


一、前情提要

        上篇我们讲了树的相关概念和存储方式。而二叉树则是树的一种特殊形式,许多实际问题抽象出来的数据结构往往是二叉树形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要。二叉树特点是每个结点最多只能有两棵子树,且有左右之分 。

二、二叉树的定义

        定义:二叉树(Binary Tree)是指树中结点的度不大于2的有序树,它是一种最简单且最重要的树。二叉树的递归定义为:二叉树是一棵空树,或者是一棵由一个根节点和两棵互不相交的,分别称作根的左子树和右子树组成的非空树;左子树和右子树又同样都是二叉树

        

       二叉树的特点有:

    (1)每个结点最多有两棵子树,所以二叉树中不存在度大于2的结点。注意不是只有两棵子树,而是最多有。没有子树或者有一棵子树也是可以的。

    (2)左子树和右子树是有顺序的,次序不能任意颠倒。就像人的左脚和右脚,穿鞋的时候不能穿反。

    (3)即使树中某结点只有一棵子树,也要区分它是左子树还是右子树。

     二叉树具有以下五种基本形态:

    (1)空二叉树  

    (2)只有一个根结点

    (3)根结点只有左子树

    (4)根结点只有右子树

    (5)根结点既有左子树又有右子树

      如下图所示:

三、特殊的二叉树

        特殊的二叉树可以分为斜树、满二叉树、完全二叉树。我们一个个来介绍。

     (一)斜树

       顾名思义,斜树一定要是斜的,但是往哪边斜还是有讲究的。

       定义:所有的结点都只有左子树的二叉树叫左斜树。所有结点都只有右子树的二叉树叫右斜树。这两者统称为斜树。

       如下图所示:

        斜树有着很明显的特点,就是每一层都只有一个结点,结点的个数与二叉树的深度相同。

        可能有人会想,这不是和线性表的结构一样吗?是的,线性表的结构就可以理解为是树的一种极其特殊的表现形式。

     (二)满二叉树

      定义: 在一棵二叉树中,如果所有的分支结点都存在左子树和右子树(分支节点概念忘记的可以去看看“树的概念”那篇博客),并且所有叶子都在同一层上,这样的二叉树称为满二叉树。     

如下图所示:

有人可能会有疑问?

        所有分支结点都有左右子树,这个是不是满二叉树呢??

        答案是否定的,有个很重要的点是“在一棵二叉树中,如果所有分支结点都存在左右子树,并且所有的叶子结点都在同一层上,这样的二叉树称为满二叉树”。前半句是满足了,后半句没满足。C、D、E都是叶子结点,但是不在同一层上。

      单是每个结点都存在左右子树,不能算是满二叉树,还必须要所有的叶子都在同一层上,这就做到了整棵树的平衡。因此,满二叉树的特点有:

    (1)叶子结点只能出现在最后一层,出现在其他层就不可能达到平衡。

    (2)非叶子结点的度一定是2。

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

    (三)完全二叉树

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

     如下图所示:

     左边的是满二叉树,右边是完全二叉树。

     定义的意思是:相同编号的结点,在不同的两棵树上位置依然相同。那么这棵树就是完全二叉树。

     咱可以简单的概括一下就是:完全二叉树就是从满二叉树中按从后往前的顺序摘除几个结点

     

    下面画几个错误的完全二叉树:

很明显编号为F,在不同的树中位置不一样,所以右边的不是完全二叉树。

    可以发现,右边的树中结点C下面没有结点。结点F、G、H、I位置也和左边的满二叉树不一样,所以右边的不是完全二叉树。

   看完了这几个例子,再来体会一下这句话“完全二叉树就是从满二叉树中按从后往前的顺序摘除几个结点。”  错误的完全二叉树都不满足这句话吧。都不是按从后往前的顺序去摘除。

   所以我们可以去总结一下完全二叉树的特点:

(1)叶子结点只能出现在最下两层。

(2)最下层叶子结点一定集中在左部连续位置。

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

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

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

四、二叉树的性质

    性质1:在二叉树的第i层至多有2^(i-1)个结点。

    首先结点数最多的树是满二叉树,我们来观察一下。

    找规律就可以发现,假设层数是i,那么该层的结点数的次数就是i-1。

    所以在二叉树的第i层至多有2^(i-1)个结点。

    性质2:深度为k的二叉树最多有2^k-1个结点。

    注意:这里一定要和性质1区分差别!!!

    性质1是2^(k-1)

    性质2是2^k之后再-1。而不是2^(k-1),不要搞混淆。

    结点数最多的树是满二叉树,我们继续来观察一下。

   总共4层,结点数=2^0+2^1+2^2+2^3。加起来就是总共2^4-1个结点。

   所以深度为k的二叉树最多有2^k-1个结点。

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

  终端结点就是叶子结点。

  我们设n1为度是1的结点数。则树T结点总数n=n1+n2+n3————①。

  再换个角度,我们观察它的连接线数。由于根结点只有分支出去,没有分支进入,所以分支线总数为结点总数减去1。

  我们就可以列一个方程:分支线总数=n-1=1*n1+2*n2。————②。

  n1,n2前面的系数很好理解,因为度数为1,就是连一根线,度数为2,就是连两根线。

  联立①②就可以得出结论:

                                           n0=n2+1

 性质4:具有n个结点的完全二叉树的深度为[log(n)]+1。对数以2为底,并下取整。

 由性质2知,当深度为k,结点数最多为2^k-1,当深度为k-1,结点数最多为2^(k-1)-1

 所以当深度为k时,结点数的范围是:2^(k-1)-1 < n <= 2^k-1  。

 转换一下---->2^(k-1) <= n < 2^k  .。

 两边同时取对数---->k-1<= logn <k    (对数以2为底)

 而深度k作为整数,因此k=[log(n)]+1。对数以2为底,并下取整。

性质5:如果对一棵有n个结点的完全二叉树(其深度为[log(n)]+1(对数以2为底,并下取整。))的结点按层序编号(从第1层到第[log(n)]+1层,每层从左到右),对任一结点i有三条性质。

    (1)如果i=1,则结点i是二叉树的根,无双亲;如果i>1,则其双亲是结点[i/2] (下取整)。          (2)如果2*i>n,则结点i无左孩子;否则其左孩子就是结点2*i。

    (3)如果2*i+1>n,则结点i无右孩子;否则其右孩子就是结点2*i+1。

    这三点没啥好解释的,看看图慢慢想吧。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值