20172311《程序设计与数据结构》第七周学习总结

20172311《程序设计与数据结构》第七周学习总结

教材学习内容总结

第十一章 二叉查找树

  • 树是一种非线性结构,其中的元素被组织成一个层次结构
  • 含有m个元素的平衡n元树具有的高度为lognm
  • 树的数组实现之计算策略:

    如果我们存储的树不是完全的或者只是相对完全的,则该数组会为不包含数据的树位置分配空间

  • 树的数组实现之模拟链接策略:

    这种方式使得元素能够连续存储在数组中,因此不会浪费空间,但是该方式增加了删除树中元素的成本。

  • 树的遍历
    1.先序遍历
    即根节点在左右子树之前遍历:
    先访问根节点
    再先序遍历左子树
    再先序遍历右子树
    退出
    2.中序遍历
    先中序遍历左子树
    再访问根节点
    再中序遍历右子树
    退出
    3.后序遍历
    即根节点在左右子树之后遍历:
    先后序遍历左子树
    再后序遍历右子树
    最后访问根节点
    退出
    4.层序遍历
    即从根节点开始,访问每一层的所有结点,一次一层

以上图为例,三种遍历结果:

先序遍历:
1 2 4 5 7 3 6

中序遍历:
4 2 7 5 1 3 6

后序遍历:
4 7 5 2 6 3 1

层序遍历:
1 2 3 4 5 6 7

  • 二叉树的ADT
  • 二叉树

    二叉树是有限个节点的集合,这个集合可以是空集,也可以是一个根节点和至多两个子二叉树组成的集合,其中一颗树叫做根的左子树,另一棵叫做根的右子树。简单地说,二叉树是每个节点至多有两个子树的树

  • 完全二叉树

    完全二叉树是一种特殊的二叉树,满足以下要求:
    1.所有叶子节点都出现在 k 或者 k-1 层,而且从 1 到 k-1 层必须达到最大节点数;
    2.第 k 层可是不是慢的,但是第 k 层的所有节点必须集中在最左边。
    简单地说, 就是叶子节点都必须在最后一层或者倒数第二层,而且必须在左边。任何一个节点都不能没有左子树却有右子树。

  • 满二叉树

    如果一棵树的高度为 k,且拥有 2^k-1 个节点,则称之为 满二叉树。
    就是说,每个节点要么必须有两棵子树,要么没有子树。

  • 满二叉树 和 完全二叉树 的对比图

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

  • 问题:链式二叉树中的find方法只能用在contain方法里,能不能返回一个BinaryTreeNode对象 ,便于往树中添加新的元素
  • 问题解决方案:
    1.find方法源代码
  public T find(T targetElement) {
        BinaryTreeNode<T> current = findNode(targetElement, root);

        if (current == null)
            throw new ElementNotFoundException("LinkedBinaryTree");

        return (current.getElement());
    }  

返回BinaryTreeNode对象的find方法代码

public BinaryTreeNode<T> findNode(T targetElement) {
        BinaryTreeNode<T> current = findNode(targetElement, root);

        if (current == null)
            throw new ElementNotFoundException("LinkedBinaryTree");

        return current;
    }  

2.经过对代码的深入理解发现这种方法并不可行,因为这样新加入的元素并不能是一个单独的LinkedBinaryTree(链式二叉树)对象,只是一个BinaryTreeNode(二叉树结点)对象,这样会导致新插入的元素不能使用链式二叉树类里的方法。

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

  • 问题:背部诊断器类运行时一直报错
  • 问题解决方案:
    经过单步调试发现是因为我的LinkedBinaryTree类里的getLeft方法和getRight方法返回的是BinaryTreeNode对象而不是LinkedBinaryTree对象,
    对两个方法进行修改后终于使问题得到解决
    1.修改前的getLeft方法和getRight方法代码
//返回结点的左侧子结点
    public BinaryTreeNode<T> getLeft() {
        return left.root;
    }
    //返回结点的右侧子结点
    public BinaryTreeNode<T> getRight() {
        return right.root;
    }  
  1. 修改后的getLeft方法和getRight方法代码
   public LinkedBinaryTree<T> getLeft() {
        return left.root;
    }
    //返回结点的右侧子结点
    public LinkedBinaryTree<T> getRight() {
        return right.root;
    }    

代码托管

上周考试错题总结

上周无错题!!!

结对及互评

  • 本周结对学习情况
    本周主要对链式二叉树进行了较为深入的学习,在学习的过程中遇到了诸多较难的问题,有的问题我们两个也是都摸不着头脑,但是通过查阅相关的资料最终使问题得到了解决!

感想

本周的主要学习内容是对树的概念进行了较为深入的了解,并且对链式二茬表的实现进行了学习和实现,本章课本的例题代码比较复杂(对我来说很复杂了),在阅读代码的过程中也是花费了不少时间,通过对本章的学习也是认识到了我的阅读代码能力还是很差的!希望以后继续努力,让自己在这方面的能力有所提高吧!

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 0/0 1/1 4/4
第二周 464/464 1/2 10/14 理解掌握了用数组和链表实现栈的方法
第三周 494/958 1/3 10/24 理解掌握了用数组和链表实现队列的方法
第四周 1629/2587 2/5 20/44 对用链表和数组实现列表进行了学习
第五周 856/3443 2/7 15/59 较为深入的学习了查找和排序方法的实现
第六周 668/4111 1/8 20/79 学习了链式二叉树的实现
  • 计划学习时间:20小时
  • 实际学习时间:20小时
  • 改进情况:注重提高阅读复杂代码的能力,努力提高解决代码bug的能力!!!

参考资料

原文地址:https://www.cnblogs.com/zhaoxiaohai/p/9898828.html

时间: 2024-08-29 17:43:13

20172311《程序设计与数据结构》第七周学习总结的相关文章

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

20172311 2017-2018-2 <程序设计与数据结构>第九周学习总结 教材学习内容总结 本周对异常和递归进行了学习 异常的处理方式有两种:一种是直接抛出,并从异常处终止程序:另一种是捕获并处理异常,从而使程序继续运行. 捕获和处理异常主要运用try-catch语句. 通过继承Exception类可以自定义一个新的异常 处理IO异常的常用方法是抛出异常. 对于某些问题,递归是最精炼和适当的解法,但对于其他问题,递归则不如迭代方法直接. 教材学习中的问题和解决过程 问题:什么是IO操作

20172311《程序设计与数据结构》第九周学习总结

20172311<程序设计与数据结构>第九周学习总结 教材学习内容总结 第十五章 图 堆(heap)就是具有两个附加属性的一颗二叉树 1.它是一颗完全树 2.对每一个节点,它小于等于或者大于等于其左孩子和右孩子 HeapADT的UML描述 addElement方法将给定的Comparable元素添加到堆中的恰当位置处,且维持该堆的完全性属性和有序属性 因为一个堆就是一颗完全树,所以对于插入的新节点而言,只存在一个正确的位置,且它要么是h层左边的下一个空位置,要么是h+1层左边的第一个位置(如果

20172311《程序设计与数据结构》第一周学习总结

20172311<程序设计与数据结构>第一周学习总结 教材学习内容总结 第一章 概述 (基于软件质量问题引导出数据结构) 高质量软件的几个特征: 质量问题: 必须优先考虑质量特征,并尽最大努力实现 数据结构:计算机存储.组织数据的方式 程序=数据结构+算法 事实证明没有一种方案可以解决所有的问题! 第二章 算法分析(高效利用CPU和内存) 增长函数:表示问题大小(n)与我们希望最优化的值之间的关系,该函数表示了该算法的时间复杂度或空间复杂度 大O记法: 所有具有相同阶次的算法,从运行效率的角度

20172311《程序设计与数据结构》第二周学习总结

20172311<程序设计与数据结构>第一周学习总结 教材学习内容总结 第三章 集合概述 --栈 集合是一种聚集.组织了其他对象的对象,它定义了一种特定的方式,可以访问.管理所包含的对象(称为该集合的元素) 集合可以分为两大类:线性集合和非线性集合 元素彼此之间的组织形式通常由元素添加到集合的次序.元素自身之间的一些内在关系决定 集合是一种隐藏了实现细节的抽象 对象是用于创建集合的一种完美机制 数据类型是一组值及作用于这些数值上的各种操作 集合是一种抽象数据类型 数据结构是一种用于实现集合的基

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

20172322 2017-2018-2 <程序设计与数据结构>第二周学习总结 教材学习内容总结 了解了print与println的区别 了解了字符串的拼接可以用+来完成 了解了转义字符的使用 学会了使用赋值 学会使用部分算术运算符 学会了使用Scanner来实现交互性 教材学习中的问题和解决过程 问题1:在最初接触赋值时对foalt和double的赋值范围不了解 问题1解决方案:使用万能的度娘后看到一个高赞答案后有了了解 问题2:在提前预习时看到2.7图形后敲入的代码无法执行 问题2解决方案

学号20172328《程序设计与数据结构》第九周学习总结

学号20172328<程序设计与数据结构>第九周学习总结 教材学习内容总结(异常和递归) 第11章:异常 1.[异常处理]: 一个异常:是一个定义非正式情况或错误的对象,由程序或者运行时环境抛出,可以根据需要捕获和处理. 错误:错误类似于异常,但是错误代表不可恢复的问题并且必须捕获处理. 2.[处理异常的三种方法]:①根本不处理异常②当异常发生时处理异常③在程序的某个位置集中处理异常. 3.[未捕获的异常]:如果程序中不处理异常,则程序将非正常的终止运行,并产生关于描述在何处发生什么异常的信息

20172326 《程序设计与数据结构》第九周学习总结

学号 20172326 <程序设计与数据结构>第九周学习总结 教材学习内容总结 异常(exception):定义非正常情况下或错误的情况的对象,由程序或运行时环境抛出,可根据需要进行相应的捕获处理. 异常与错误的区别:错误代表不可恢复的问题并且必须捕获处理.而异常可以忽视,或者使用try语句处理,或调用更高级的方法. 可检测异常与不可检测异常:可检测异常必须由方法捕获,或者必须在可能抛出或传递异常方法的throws子句中列出来.在方法定义的声明头中追加一条throws子句.不可检测异常不需要使

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

20172322 2017-2018-2 <程序设计与数据结构>第九周学习总结 教材学习内容总结 异常 学会了使用try-catch来实现未捕获的异常的处理.可以使得异常被捕获进而不导致程序出现错误退出.使用try写入可能产生异常的语句,使用catch来编写在捕获异常后继续执行的代码(可以为空). "未捕获的异常"指在编译过程中不会被编译软件显示异常但是在运行时会出现异常导致程序直接退出,例如:"ArithmeticException"."In

20172327 2018-2019-1 《程序设计与数据结构》第九周学习总结

20172327 2018-2019-1 <程序设计与数据结构>第九周学习总结 教材学习内容总结 第十五章 图 无向图 1.图的概念(非线性结构):允许树中每个结点与多个结点相连,不分父子结点. 2.图由顶点和边组成. 顶点由名字或标号来表示,如:A.B.C.D: 边由连接的定点对来表示,如:(A,B),(C,D),表示两顶点之间有一条边. 3.无向图:顶点之间无序连接. 如:边(A,B)意味着A与B之间的连接是双向的,与(B,A)的含义一样. 4.邻接(邻居):两个顶点之间有边连接. 5.自

《程序设计与数据结构》第九周学习总结

学号 20172326 <程序设计与数据结构>第九周学习总结 教材学习内容总结 图:图(Graph)是一种复杂的非线性结构,在图结构中,每个元素都可以有零个或多个前驱,也可以有零个或多个后继,也就是说,元素之间的关系是任意的.与树的区别在于树中的一个结点只有一个前驱,也就是说只有一个父结点.但图中的顶点(结点)是没有这种限制关系的. 无向图:边为无需结点对的图.也就是说,现有两个顶点A.B.(A,B)与(B,A)效果相同.当两个顶点之间有边连接,也就是说这两个顶点是邻接的,也称作邻居.一个顶点