zoukankan      html  css  js  c++  java
  • 二叉树的有关计算

    有关概念:https://www.cnblogs.com/schips/p/10630533.html

    参考:  https://blog.csdn.net/bojie5744/article/details/30744767


    计算公式

    https://blog.csdn.net/stf1065716904/article/details/80874065

    1. n个节点的二叉树一共有((2n)!)/(n! * (n+1)!)种
     
      catalan数,C(n)=(1/(n+1))*((2*n)!/(n!*n!))

    2. n层二叉树的第n层最多为2^(n-1)个
    3. 二叉树节点计算公式 N = n0+n1+n2,度为0的叶子节点比度为2的节点数多一个。N=1*n1+2*n2+1
    4. 对任何一棵二叉树T,如果其终端节点数为n0,度为2的节点数为n2,则n0=n2+1
    5. 具有n个节点的完全二叉树的深度为log2(n) + 1
    6. B-树,除叶子与根节点以外的任意结点的分支数介于[m/2,m](取上整)
    7. 具有n 个结点的完全二叉树的深度为[log2n]+1


     

     二叉树的度计算
    有一个计算二叉树节点的公式,相信很多人都知道:
      度为0的节点数为度为2的节点数加1,即n0=n2+1,知道这个公式,相关题目就可以轻松解决;

    下面来讨论下如何得出这个公式的:
    设:
      k:总度数
      k+1:总节点数
      n0:度为0的节点
      n1:度为1的节点
      n2:度为二的节点

    根据二叉树中度和节点的守衡原理,可列出以下一组方程:
    k=n2*2+n1;
    k+1=n2+n1+n0;
    将上面两式相减得到:n0=n2+1;

    例【1】:已知767个节点的完全二叉树,求其叶子节点个数?
    解析:

    注意:

      对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。

      也就是说,如果完全二叉树有度为1的结点,那么也只有1或者0两种情况


      n0=n2+1;
      n=n0+n1+n2;
      由上面,消掉n2得到:

      n=2n0+n1-1;

      由于完全二叉树度为1的只有0个或1个两种情况,所以,将0或1带入上面公式,整理后得:
      n0=(n+1)/2或者n0=n/2;
      看看n是否能被2整除,能则用n0=n/2。否则用n0=(n+1)/2
      既:叶子节点为n0=(n+1)/2=384


    例【2】:已知完全二叉树的结点有700个,求其叶子结点的个数?
    解析:  
      完全二叉树,要求是除了最下面一层节点和部分倒数第二层节点外,所有节点均是满树。
      因此我们可以得到以下满树的规律:
      第一层:根节点 1个,即2^0个   

      第二层:两个,即:2^1个

      第三层:4个,即:2^2个
         ....
        也就是说,n层满树的节点个数是: (根据等比数列求和公式)

    等比数列前n项之和

    ①当q≠1时,
    ②当q=1时,
    等比数列中,首项a1与公比q都不为零.

    注意:上述公式中a^n表示A的n次方

    (也可以通过计算二进制中,从最低位开始的n位连续被置一的值求出前n项和)


          2^0+2^1+2^2+...+2^(n-1)=2^n-1
       所以:700个节点的完全二叉树最多10层
       即第1-9层是满树,共有:511个节点
       也就是说:第十层还有:700-511=189个节点,这些节点全叶子节点
       于是完全二叉树,最后一层最多有一个节点不满,
       所以第9层左边的95个节点是非叶子节点,
       因此第九层有:256-95=161个有叶子节点
       第十层有:189个叶子节点
       因此共有:189+161=350个叶子节点

    总结以上,我们可以看到,在完全二叉树中,
    叶子节点的个数是:

      [(n+1)/2](n为奇数)

      或

       [n/2](n为偶数)




    某二叉树中有15个度为1的结点,16个度为2的结点,则该二叉树中总的结点数为( )。

    • A.32
    • B.46
    • C.48
    • D.49
    • 参考答案:C
    • 解题思路:在树结构中,一个结点所拥有的后件个数称为该结点的度,所有结点中最大的度称为树的度。对任何一棵二叉树,度为0的结点(即叶子结点)总是比度为2的结点多一个。由16个度为2的结点可知叶子结点个数为17,则结点结点总数为16+17+15=48,C选项正确。
    • n0 = n2 +1;   n = n0 + n1 + n2

    1.二叉树的深度和层数其实是一样的。

    2.任意一棵树的总结点数等于总分支数+1

    3.叶子结点也称叶子,度为0的结点。

    4.一个深度为n的满二叉树的总结点数为  (2^(n-1))  -1(其实得出这个结论画个图就知道了,不难)

    5.深度为h的完全二叉树至少有2^(h-1)个结点,最多有(2^h)-1个结点。

    相关题目:

    1.      一棵二叉树第六层(根结点为第一层)的结点数最多为?

                 其实这道题很简单,就是2^5=32

     

    2.     某二叉树中度为2的结点有18个,则该二叉树中有多少个叶子结点?

             根据总结点数=总分支数+1,设叶子有n个,则有

                   18 + n = 18*2 + 1

                           n = 19

     

    3.设一棵完全二叉树共有199个结点,那么该二叉树共有个分支结点?

    思路就是先求出这个完全二叉树的叶子数,然后用总结点数减去叶子数就是分支结点的数目了。

    因为有                               (2^7) - 1<199<=(2^8)-1

    所以得深度为8,前7层为满二叉树,所以前7层的总结点数为(2^7) - 1 = 127  ,第7层的结点数为 2^6 = 64

    则最后一层的叶子为  199 - 127 = 72  ,所以第7层的叶子数为  64 - 72/2 = 28

    所以总叶子数为   72+28 = 100

    分支数为 199 -100 = 99

     

    4.在深度为7的二叉树中,最多有多少个叶结点?(注意这里问的是叶结点,而不是结点数,如果是结点数的话答案是(2^6)-1  )

    这种题目和例子1差不多,为    2^6

     

    5.设一棵完全二叉树共有127个结点,那么该二叉树是满二叉树吗?

    因为         一个深度为n的满二叉树的总结点数为  2^(n-1)-1

    则设       2^(n-1)-1 = 127

                       n = 8 ,所以这也是满二叉树。

     

     

    6.具有53个结点的完全二叉树的深度为?

    因为一个二叉树的结点数必然不会超过深度一样的满二叉树的结点数,所以有             (2^5) - 1<53<=(2^6)-1              

    所以答案为6

     

    7.设一棵完全二叉树共有700个结点,则在该二叉树中有多少 个叶子结点?

    从第五题延伸出来的题目,由例6的思路得,           (2^9)-1  <700<=(2^10) - 1

    所以得这棵二叉树前面9层是满二叉树,则得前9层的总结点数为  (2^9)-1  = 512 -1 =511

    则剩下来的结点数就是最后一层的结点数,为   700 - 511 = 189 ,把他凑成偶数为190,则也就是说,

    最后一层是从第九层中  190/2= 95个结点延伸出来的,所以第九层失去了95个叶子,又因为第九层的

    结点数为  2^8 = 256,则第九层的叶子数为  256 - 95,则所有的结点数为256-95 +189 =350

     

    了解了第6题后,下面给出一道判断题给大家,让读者来做判断。是答案错还是那位楼主错?

     

     

    例题待续

     

     

     
    ---------------------
    作者:@heyun
    来源:CSDN
    原文:https://blog.csdn.net/bojie5744/article/details/30744767
    版权声明:本文为博主原创文章,转载请附上博文链接!

    完全二叉树:叶子节点只能出现在最下层和次下层,并且最下面一层的结点都集中在该层最左边的若干位置的二叉树。


    1、一颗完全二叉树上有600个节点,其中叶子节点的个数是?

    简便来算,就是 n0=n/2,其中n为奇数时(n1=0)向上取整;n为偶数时(n1=1)。可根据完全二叉树的结点总数计算出叶子结点数。


    ---------------------
    作者:野马16
    来源:CSDN
    原文:https://blog.csdn.net/horacehe16/article/details/79618970
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    iOS多线程的初步研究(十)-- dispatch同步
    iOS 几种定时器
    iOS 如何计算UIWebView的ContentSize
    iOS 如何计算UIWebView的ContentSize
    iOS: NSTimer使用小记
    iOS: NSTimer使用小记
    使用Objective-C的+(void)initialize初始化static变量
    使用Objective-C的+(void)initialize初始化static变量
    拒绝从入门到放弃_《Python 核心编程 (第二版)》必读目录
    拒绝从入门到放弃_《Python 核心编程 (第二版)》必读目录
  • 原文地址:https://www.cnblogs.com/schips/p/10630738.html
Copyright © 2011-2022 走看看