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小时

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

参考资料

20162325 金立清 S2 W7 C16的更多相关文章

  1. 20162325 金立清 S2 W9 C18

    20162325 2017-2018-2 <程序设计与数据结构>第9周学习总结 教材学习内容概要 堆是一棵完全二叉树,其中每个元素大于等于其所有子结点的值. 向堆中添加一个元素的方法是,首 ...

  2. 20162325 金立清 S2 W5 C14

    20162325 2017-2018-2 <程序设计与数据结构>第5周学习总结 关键内容摘要 集合是收集并组织其他对象的对象 集合中的元素一般由加入集合的次序或元素之间某些固有的关系而组织 ...

  3. 20162325 金立清 S2 W3 C13

    20162325 2017-2018-2 <程序设计与数据结构>第3周学习总结 教材学习内容概要 查找是在一组项内找到指定目标或是确定目标不存在的过程 高效的查找使得比较的次数最少 Com ...

  4. 20162325 金立清 S2 W11 C20

    20162325 2017-2018-2 <程序设计与数据结构>第11周学习总结 教材关键概念摘要 在哈希方法中,元素保存在哈希表中,其在表中的位置由哈希函数确定. 两个元素或关键字映射到 ...

  5. 20162325 金立清 S2 W10 C19

    20162325 2017-2018-2 <程序设计与数据结构>第10周学习总结 认识 线性表和树两类数据结构,线性表中的元素是"一对一"的关系,树中的元素是" ...

  6. 20162325 金立清 S2 W6 C15

    20162325 2017-2018-2 <程序设计与数据结构>第6周学习总结 教材学习内容概要 队列是先进先出(FIFO)的集合 队列是保存重复编码k值的一种有效结构 实现模拟时常用队列 ...

  7. 20162325 金立清 S2 W8 C17

    20162325 2017-2018-2 <程序设计与数据结构>第8周学习总结 教材学习内容概要 二叉查找树是一棵二叉树,对于其中的每个结点,左子树上的元素小于父结点的值,而右子树上的元素 ...

  8. 20162325金立清 实验四 Android程序设计 实验报告

    实验四 Android程序设计 实验报告 代码托管地址 码云链接 实验内容 安装使用Android Stuidio Activity测试 UI测试 布局测试 事件处理测试 Android程序设计-1 ...

  9. 2017-2018 第一学期201623班《程序设计与数据结构》-第7&8周作业问题总结

    一.作业内容 第7周作业 http://www.cnblogs.com/rocedu/p/7484252.html#WEEK07 第8周作业 http://www.cnblogs.com/rocedu ...

随机推荐

  1. java面向对象之个人总结

    面向对象有三大特性:继承,封装,多态 1.继承: (1)继承的特点:A,java支持单根继承,不支持多根继承 B,java支持多层继承(继承体系) (2)细节注意:A.子类只能继承父类的非私有成员(成 ...

  2. 基于Jq的手写插件

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8&quo ...

  3. Duplicate entry '' for key 'username'

    一.报错信息: ERROR 2019-04-22 02:00:29,971 exceptions 30 [<wechat.views.WixinView object at 0x7f3bb01d ...

  4. 微信公众号开发被动回复用户消息,回复内容Content使用了"\n"换行符还是没有换行

    使用语言和框架:本人后端开发使用的Python的DRF(Django REST framework)框架 需求:在微信公众号开发时,需要实现自动回复,即被关注回复.收到消息回复.关键词回复 发现问题: ...

  5. Scala中的类学习

    Scala中的类学习 从java了解类的情况下,了解Scala的类并不难.Scala类中的字段自动带getter和setter方法,用@BeanProperty注解生成javaBean对象的getXX ...

  6. 十张图了解Docker【转】

    这篇文章希望能够帮助读者深入理解Docker的命令,还有容器(container)和镜像(image)之间的区别,并深入探讨容器和运行中的容器之间的区别. 当我对Docker技术还是一知半解的时候,我 ...

  7. Java集合——TreeMap源码详解

    )TreeMap 是一个有序的key-value集合,它是通过红黑树实现的.因为红黑树是平衡的二叉搜索树,所以其put(包含update操作).get.remove的时间复杂度都为log(n). (2 ...

  8. django学习笔记(2)

    Part 2: The admin site ====> Creating an admin user$ python manage.py createsuperuser   Username: ...

  9. 10 star组件之分页, search模糊查询, action批量处理

    1.分页组件高阶 1.分页的class形式(有bug,请看下面的) """ 自定义分页组件 """ class Pagination(obj ...

  10. 将windows上.net core 发布的程序部署到linux(ubantu等)上

    首先在linux安装相应的.net core 环境,根据官方的示例安装即可:参考地址:https://dotnet.microsoft.com/learn/dotnet/hello-world-tut ...