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小时
-
改进情况:多思考,多总结
参考资料
-
树PPT
-
CSDN博客