二叉树性质及习题

二叉树性质及习题二叉树性质:1.在二叉树的第k层至多有2^(k-1)个结点。(k>=1)2.深度为k的二叉树至多有2^(k-1)个结点(k>=1)。3.对任何一棵二叉树T,如果其叶结点数为n0,度为2的结点数为n2,则n0=n2+1。证明:若度为1的结点有n1个,总结点个数为n,总边数为e,则根据二叉树的定义,n=n0+n1+n2…

大家好,又见面了,我是你们的朋友全栈君。

二叉树性质:
1.在二叉树的第 k层至多有 2^(k -1)个结点。(k>=1)
2.深度为 k 的二叉树至多有 2^(k-1)个结点(k >=1)。
3. 对任何一棵二叉树T, 如果其叶结点数为n0, 度为2的结点数为 n2,则n0=n2+1。
证明:
若度为1的结点有 n1个,总结点个数为n,总边数为 e,则根据二叉树的定义,

        n = n0 + n1 + n2    

        e = 2n2 + n1 = n - 1 (除了根节点,每个节点对应一条边 )

       因此,有  2n2+ n1 =n0 + n1 + n2- 1

                      n2= n0 - 1  =>   n0= n2+ 1

      空链域:2n0+ n1 = n0 + n2 +1+ n1 = n+1

4.具有 n (n>=0) 个结点的完全二叉树的深度为+1

   证明:设完全二叉树的深度为 h,则根据性质2 和完全二叉树的定义有

        2^(h-1)- 1 < n <= 2^h - 1或 2^(h-1)<= n < 2^h

           取对数 h-1 < log2n  <= h,又h是整数,

           因此有 h = +1 

5.如果对一棵有n个结点的完全二叉树的结点按层序编号(从第一层到最后一层,每层从左到右),对任一结点i(1<=i<=n)有:

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

完全二叉树:
定义:
若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。(结点可为单个)
(1)所有的叶结点都出现在第k层或k-l层(层次最大的两层)
(2)对任一结点,如果其右子树的最大层次为L,则其左子树的最大层次为L或L+l。
在这里插入图片描述

性质:
如果一棵具有n个结点的深度为k的二叉树,它的每一个结点都与深度为k的满二叉树中编号为1~n的结点一一对应,这棵二叉树称为完全二叉树。

可以根据公式进行推导,假设n0是度为0的结点总数(即叶子结点数),n1是度为1的结点总数,n2是度为2的结点总数,则 :
①n= n0+n1+n2 (其中n为完全二叉树的结点总数);又因为一 个度为2的结点会有2个子结点,一个度为1的结点会有1个子结点,除根结点外其他结点都有父结点
②n= 1+n1+2n2 ;由①、②两式把n2消去得:n= 2n0+n1-1,**由于完全二叉树中度为1的结点数只有两种可能0或1,**由此得到n0=n/2 或 n0=(n+1)/2。

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

完全二叉树通常采用数组存储

习题:
例:
设一棵完全二叉树共有699个结点,则在该二叉树中的叶子
多种方法:
1.根据 “二叉树的第 i层至多有 2^(i – 1) 个结点;深度为 k的二叉树至多有
2^k – 1 个结点(根结点的深度为 1)”这个性质:
因为 2^9-1 < 699 < 2^10-1 , 所以这个完全二叉树的深度是 10,前 9层是一个满二叉树,这样的话,前九层的结点就有 2^9-1=511 个;而第九层的结点数是 2^(9-1)=256
所以第十层的叶子结点数是 699-511=188 个;
现在来算第九层的叶子结点个数。
由于第十层的叶子结点是从第九层延伸的,所以应该去掉第九层中还有子树的结点。因为第十层有 188个,所以应该去掉第九层中的 188/2=94个;
所以,第九层的叶子结点个数是 256-94=162,加上第十层有 188个,最后结果是 350个。
2.根据 n0=n/2,其中n为奇数时(n1=0)向上取整;n为偶数时(n1=1)向下取整。可根据完全二叉树的结点总数计算出叶子结点数得到结果
其他题目:https://wenku.baidu.com/view/988bd3b5ab00b52acfc789eb172ded630b1c98e6.html?re=view

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/138160.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 动感地带亲情省

    动感地带亲情省注:本文转自网络为进一步满足客户国内长途及国内漫游通话需求,中国移动北京公司将于近期推出长漫亲情省业务,现就相关事宜通知如下:  一、推出时间  2009年4月18日0时  二、目标客户动感地带、

    2022年7月3日
    29
  • Java8:LocalDate LocalDateTime Date相互转化

    Java8:LocalDate LocalDateTime Date相互转化概述时间日期处理是平时工作中使用非常频繁的逻辑,Java8中提供的新的时间类LocalDateTime和LocalDate,使日期处理可以更简单。友情提醒下,业务开发中最好默认使用LocalDateTime,因为LocalDateTime可以很方便的转换为LocalDate,但是LocalDate是不可以转为LocalDateTime的,会没有时分秒的数据!!!实例publicstaticvoidmain(String[]args){StringcurrentDate

    2022年9月28日
    0
  • typora安卓_Markdown编辑器:Typora

    typora安卓_Markdown编辑器:Typora免费好用的Markdown写作工具,支持图片,代码高亮、插入表格、自定义主题、CSS完全配置等。如果你懂一点计算机基础,它还可以是一个“浏览器”。Typora(V0.9.9.26)关于Typora的介绍如下:Readable&WritableTyporawillgiveyouaseamlessexperienceasbothareaderandaw…

    2022年5月19日
    46
  • C++控制台制作ATM机[通俗易懂]

    C++控制台制作ATM机[通俗易懂]文章目录题目代码实现所需要头文件Card类Bankcard类ATM类ATM类函数的声明主函数题目在控制台编程中共设置了三个类,ATM类、Card类和Bankcard类,设计函数实现登录、查询、修改密码、取款、存款、转账以及退出系统等功能。程序分别从MFC控件和c++控制台实现。同时在要求的基础之上,进行了部分仿ATM的优化,例如在登陆界面输入错误三次就会冻结账号退出系统,在MFC对话框中加入图…

    2022年8月18日
    3
  • phpstorm 2021 3月份 激活码破解方法

    phpstorm 2021 3月份 激活码破解方法,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月15日
    36
  • 32位int取值范围_正则表达式判断是否是int32

    32位int取值范围_正则表达式判断是否是int32在做游戏的开发中,由于游戏运行的时间已经很长,数据量

    2022年9月20日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号