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

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

教材学习内容总结

第十章 树

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

    若是咱们存储的树不是彻底的或者只是相对彻底的,则该数组会为不包含数据的树位置分配空间
    git

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

    这种方式使得元素可以连续存储在数组中,所以不会浪费空间,可是该方式增长了删除树中元素的成本。
    数据结构

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

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

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

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

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

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

  • 二叉树的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的能力!!!

参考资料

相关文章
相关标签/搜索