20162325 金立清 S2 W7 C16

20162325 2017-2018-2 《程序设计与数据结构》第7周学习总结

教材学习内容概要


树是非线性结构,其元素组织为一个层次结构
树的度表示树种任意结点的最大子结点数
有m个元素的平衡n叉树的高度是log n底m
树的遍历有4种方法
进行层序遍历时可用队列来储存树中的元素使用数组实现二叉树时,位于位置n的元素的左孩子在(2n+1)的位置,其右孩子在(2*(n+1))的位置
树的基于数组存储实现方式可以占据数组中的连续位置,不管树是不是完全树
如何在一般二叉树中添加及删除元素,要取决于树的用途
使用决策树可以设计专家系统


  • 树(tree)是n( n≥0 )个结点的有限集。n=0时称为空树。在任意一棵非空树中:(1)有且仅有一个特定的称为根(Root)的结点;(2)当 n>1 时,其与结点可分为m( m>0 )个互不相交的有限集 T1,T2,...,Tm,其中每个集合本身又是一棵树,并且称为根的子树(SubTree)。

结点分类


  • 结点拥有的子树数称为结点的度。度为0的结点称为叶结点(Leaf)或终端结点。除根结点外,分支结点也称为内部结点。树的度是树内各结点的度的最大值。

结点间关系


  • 结点的子树的根称为该结点的孩子,相应地,该结点成为孩子的双亲。同一个双亲的孩子之间互称兄弟。结点的祖先是从根到该结点所经分支上的所有结点,反之,以某结点为根的子树的任一结点都称为该结点的子孙。

其他相关概念


  • 结点的层次(Level)从根开始定义起,根为第一层,根的孩子为第二层。双亲在同一层的结点互称为堂兄弟。树中结点的最大层次成为树的深度(Depth)或高度。

  • 若树中结点的各子树堪称从左到右是有次序的,不能互换的,则称该树为有序树,否则称为无序树。

  • 森林(Forest)是m( m≥0 )棵互不相交的树的集合。

  • 二叉树的结点度数至多为2

  • 已知先序序列和后序序列,无法唯一确定一棵二叉树(另外两种可以);只知三者中一种,也不行

比较线性结构和树结构


线性结构 树结构
第一个数据元素:无前驱 根结点:无双亲,唯一
最后一个数据元素:无后继 叶结点:无孩子,可以多个
中间元素:一个前驱,一个后继 中间元素:一个前驱,一个后继
中间元素:一个前驱,一个后继 中间元素:一个前驱,一个后继

二叉树


  • 二叉树(Binary Tree)是n(n≥0)个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树的二叉树组成。

  • 二叉树特点:
    1.每个结点最多有两棵子树,所以二叉树中不存在度大于2的结点。没有子树或者有一棵子树是可以的,最多有两棵子树。
    2.左子树和右子树是有顺序的,次序不能颠倒。
    3.即使树中某结点只有一棵子树,也要区分它是左子树还是右子树。

  • 二叉树具有五种基本形态:1.空二叉树;2.只有一个根结点;3.根结点只有左子树;4.根结点只有右子树;5.根结点既有左子树又有右子树。

特殊二叉树


斜树


  • 所有的结点都只有左子树的二叉树叫左斜树。所有的结点都是只有右子树的二叉树叫右斜树。这二者统称为斜树。斜树有明显特点,每一层都只有一个结点,结点的个数和二叉树的深度相同。斜树和线性表结构一样,线性表结构是树的一种特殊表现形式。

满二叉树


  • 在一棵二叉树中,如果所有分支结点都存在左子树和右子树,并且所有叶子都在同一层上,这样的二叉树称为满二叉树。单是每个节点都存在左右子树,不能算是满n二叉树,还必须要所有的叶子结点都在同一层上,这样就做到了整棵树的平衡。所以,满二叉树的特点是:1.叶子只能出现在最下一层,出现在其他层就不能达到平衡;2.非叶子结点的度一定是2;3.在同样深度的二叉树中,满二叉树的结点最多,叶子数最多。

完全二叉树


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

  • 完全二叉树的特性:
    (1)叶子结点只能出现在最下两层。
    (2)最下层的叶子一定集中在左部连续位置。
    (3)倒数第二层,若有叶子结点,一定都在右部连续位置。
    (4)如果结点度为1,则该结点只有左孩子,即不存在只有右子树的情况。
    (5)同样结点数的二叉树,完全二叉树的深度最小。

二叉树的性质


性质一:在二叉树的第i层上至多有 2^(i−1) 个结点(i≥1)。—–归纳法

性质二:深度为k的二叉树至多有 (2^k) −1 个结点(k≥1)。—–归纳法

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

设 n1 为度是1的结点数,那么T结点总数 n=n0+n1+n2 。换个角度,数数连接连线,因为根结点只有分支出去,没有分支进入,所以分支线总数为结点总数减去1,分支线总数为 n−1=n1+2n2 ,两个式子相减得到 n0=n2+1。
性质四:具有n个结点的完全二叉树的深度为 |log2底n|+1(其中|x|表示不大于x的最大整数)。

性质五:如果对一棵有n个结点的完全二叉树(深度为 |log2底n|+1)的结点按层序编号(从第1层到第 |log2底n|+1层,每层从左到右),对任一结点i(1≤i≤n)有:
1.如果 i=1,则结点i是二叉树的根,无双亲;如果 i>1,则其双亲是结点|i/2|。
2.如果2i>n,则结点i无左孩子(结点i为叶子结点);否则其左孩子是结点2i。
3.如果2i+1>n,则结点i无右孩子;否则其右孩子是结点2i+1。

教材学习中的问题和解决过程

  • 问题1:课上测验第一题中问“有100个结点的完全二叉树的叶结点数是多少?” 按二叉树性质二,深度为k的二叉树至多有 2k−1 个结点,假设是满二叉树,则当k=7时最接近101,所以是7层,可计算前6层有63个结点,即第七层有100 - 63 =37个叶结点,但在看到完全二叉树与满二叉树的区别中写“完全二叉树最下层上的结点都集中在该层最左边的若干位置上”,又【倒数第二层,若有叶子结点,一定都在右部连续位置】,故认为最下层有且只能有左结点,倒数第二层有且只能有右结点,理解不了为什么“第六层有32-19=13个叶子节点”中的19是如何得出的,按道理第六层应该不含叶结点才对,因为都与第七层相连了。

  • 问题1解决方案:通过张之睿同学的解释,“完全二叉树最下层上的结点都集中在该层最左边的若干位置上”其实是指靠左排布,倒数第二层也是靠右排布,第七层的37个叶节点要占第六层19个节点(37/2=18余1,18个结点满度),所以减19,总共50个叶子结点。

代码调试中的问题和解决过程

  • 问题1:在实现书上代码时,BTNode类和LinkedBinaryTree类中有一个没出现过的类——ArrayIterator,java的包里找到,询问搭档也无果。

  • 问题1解决方案:娄老师找了三个版本的教材,但未能找到这个类,尚待解决。

代码托管

上周考试错题总结

本周结对学习情况

  • 20162311
  • 结对学习内容
    - 二叉树的性质
    - 课堂练习题

其他(感悟、思考等,可选)

  • 这周学的树,与以往的线性结构不同,虽然对课堂上讲的性质与练习题,接受上没有问题,但课下对几种遍历的实现理解起来还是很困难,希望通过更多的查看相关博客和尝试编码,能够基本顺利完成下堂课的实验……(虽然还是害怕

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 58/ 1/1 10/10
第二周 8/18
第三周 134/ 3/4 12/ 30
第四周 2/6 12/42
第五&六周 750/ 6595 5/11 24/66
第七周 764/7068 7/13 18/84
  • 计划学习时间: 18小时

  • 实际学习时间: 18小时

  • 改进情况:多思考,多总结

参考资料

原文地址:https://www.cnblogs.com/JXY6996/p/7698499.html