• 20182307 2019-2020-1 《数据结构与面向对象程序设计》第九周学习总结


    20182307 2019-2020-1 《数据结构与面向对象程序设计》第九周学习总结

    教材学习内容总结

    • 第十六章 介绍了另一种数据结构:树。不同于之前学习的栈、队列、链表等线性集合,树是一种非线性集合,其中的元素组织为层次结构。本章还介绍了包括树的分类、四种遍历树的方法在内的知识,完善了树的基本知识的框架。

    学习笔记:

      • 树是非线性结构,其中的元素组织为层次结构
      • 树只有唯一的根结点
      • 树的度表示树中任意结点的最大子结点数
      • 有m个元素的平衡n叉树的高度是logn(m)
    • 结点
      • 没有任何子结点的结点称为叶结点
      • 结点的层是从根到该结点的路径长度,而路径长度为从根到该结点的路径上的边数
    • 树的遍历
      • 先序遍历:访问根,自左至右遍历子树
      • 中序遍历:遍历左子树,再访问根,然后自左至右遍历剩余子树
      • 后序遍历:自左至右遍历子树,最后访问根
      • 层序遍历:从树顶到树底,从左至右访问每个结点
        • 进行层序遍历时可用队列来存储树中的元素
    • 数组计算链
      • 对于存储在数组中位置为n的元素,元素的左子结点存储在(2n+1)的位置,元素的右子结点存储在(2*(n+1))的位置
      • 树的基于数组的存储链实现方式可以占据数组中的连续位置,不管树是不是完全树
    • 二叉查找树
      • 对于二叉查找树的每个结点,左子树上的元素小于父结点的值,右子树上的元素大于等于父结点的值
      • 最有效的二叉查找树是平衡的,所以每次比较时可以排除一半的元素
      • 删除元素时需要考虑的三种情况
        • 叶结点
        • 有一个子结点
        • 有两个子结点

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

    • 问题1:如何区别先序、中序、后序三种遍历?层序又有何不同?
      • 书本内容:树的遍历有4种基本的方法,这4种方法都从根结点开始
      • 个人理解:先序、中序、后序三种遍历的方法其实从命名方法上就可以读出分辨点,即根据访问根的先后次序来区分。比如,先序遍历就是先访问根,而中序是先访问左子树,中间次序时访问根,最后访问右子树。而层序遍历的思想与前三种无法比较,但却是一种较好理解的遍历方式,即一层层、从左至右的访问各个结点,个人认为是属于最简单的遍历方式。
    • 问题2:如何根据先序与中序序列构建一棵唯一二叉树
      • 网络资料:根据树前序遍历和中序遍历构建二叉树
      • 个人理解:如果要编写一个这样的程序,首先要注意的是只有已知先序和中序、中序和后序这两种情况的时候才可以确立一棵唯一二叉树,而已知先序和后序是不能确定的,因为左右子树可能不同。所以构建时的基本思想是这样的:先序序列的第一个结点肯定是根节点,所以先在中序序列中找到相同的根节点,以它为划分左右分别为左右子树。再进行相似的步骤,先序序列的第二个元素就是左子树的第一个节点,再在中序序列中以它为中心划分左右子树,以此类推。构建完左边的整个子树后,以相同的原理构建右子树。
        1
    • 问题3:二叉查找树怎么处理三种情况?
      • 书本内容:删除元素时需要考虑的三种情况:叶结点、有一个子结点、有两个子结点
      • 个人理解:首先要清楚删除时的三种情况。最简单的是删除叶子结点的情况,由于叶子结点是没有子结点的,所以不需要考虑重新链接的问题,直接删除即可;若是要删除有一个子结点的结点,只需要用该结点的子结点来替代被删的父结点,程序中使用递归重新链接一次即可;最复杂的是有两个子结点的结点,当遇到这种情况的时候,比较好的解决方法是用被删结点的中序后继结点取代它。所谓中序后继结点即为中序序列中,按顺序出现的下一个结点。实现过程为先从树中删除结点的中序后继,然后用此结点来替代实际要删除的结点。
        2
        3

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

    • 问题1:教材代码中的ArrayIterator类无法识别
      • 原因分析:Iterator模式是用于遍历集合类的标准访问方法。它可以把访问逻辑从不同类型的集合类中抽象出来,从而避免向客户端暴露集合的内部结构.每一种集合类返回的Iterator具体类型可能不同,例如setArray(array)就返回ArrayIterator
      • 解决方案:修改方法的定义类型为ArrayList
    • 问题2:设计决策树的时候,无法按变量命名顺序赋值
      • 原因分析:由于决策树程序所使用的LinkedBinaryTree类中包含的构造方法设计思路是自底向上的,所以要先定义决策树的叶子节点,然后再根据设计逐层向上连接左右子树。所以如果变量赋值不按顺序是正常的。
      • 解决方案:按照自底向上的顺序定义、赋值变量,最终构建成树

    代码托管

    上周考试错题总结

    • 上周无考试

    学习进度条

    代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
    目标 10000行 30篇 400小时
    第一周 209/209 2/2 9/9
    第二、三周 290/499 2/4 18/28
    第四周 516/1015 2/6 22/50
    第五周 2981/3996 2/8 32/82
    第六周 1498/5494 2/10 20/102
    第七周 1519/7013 2/12 51/153
    第八周 1641/8654 2/14 21/174
    第九周 2451/11105 2/16 30/204

    点评过的同学博客和代码

    • 本周结对学习情况

    • 结对学习内容

      • 树的分类
      • 树的四种遍历方法
      • 二叉树的实现与应用
      • 二叉查找树的实现
      • 决策树的实现
    • 上周博客互评情况

  • 相关阅读:
    消息传递协议
    TSL 访问器
    graph engine
    uwp 动画Storyboard
    iOS播放视频时候,忽略设备静音按钮
    Could not find Developer Disk Image
    GIT常用命令
    iOS 音频播放时听筒及扬声器切换
    iOS 9:ATS
    iOS设计模式
  • 原文地址:https://www.cnblogs.com/algerlu/p/11886795.html
Copyright © 2020-2023  润新知