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

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

教材学习内容总结

本章的内容主要讲树,顾名思义树与队列、栈、列表最大的区别就在于,树是一种非线性结构,其元素是一种层次结构存放。html

树:java

  • 用于描述树相关的术语有很是多,除了以前经常使用的结点(node)还有边(edge)、孩子、兄弟等等,其中我认为比较重要的有:
    • 内部节点:非根节点,且至少有一个子结点
    • 同胞节点:属于同一节点的子结点
    • 叶节点:不包含任何子节点的结点
  • 树的分类:能够有很是多的分类方式,可是最重要的标准是任一结点能够具备的最大孩子数目,成为(order),n元树的定义也是由此定义的
  • 树的数组实现:由于数组实现树比较麻烦,因此在树的数组实现中书上一样模拟了连接策略,如图所示。

    node

  • 树的遍历,
    • 前序遍历:从根节点开始访问每个节点及其孩子。如图:git

    • 中序遍历:从根节点开始(注意并非先访问根节点),中序遍历根节点的左子树,而后是访问根节点,最后中序遍历根节点的右子树。如图:数组

    • 后序遍历:从左到右先叶子后节点的方式遍历访问左右子树,最后访问根节点。如图:数据结构

    • 层序遍历:从树的第一层,也就是根节点开始访问,从上到下逐层遍历,在同一层中,按从左到右的顺序结点逐个访问。如图:post

二叉树

(二叉树极其重要,以致于用三级标题来写它,而不是通常的一个点。)二叉树又名二元树,它的每个结点最多具备两个孩子结点。学习

  • 首先咱们来看看百度百科的对树的定义:二叉树是一个连通的无环图,而且每个顶点的度不大于3。有根二叉树还要知足根结点的度不大于2。有了根结点以后,每一个顶点定义了惟一的父结点,和最多2个子结点。然而,没有足够的信息来区分左结点和右结点。若是不考虑连通性,容许图中有多个连通份量,这样的结构叫作森林。
  • 与以前相似,本次教材也给出了二叉树的ADTBinaryTreeADT其中的基本方法有:getRootisEmptysizecontainsfindtoString和一些迭代器相关的方法。
  • 书上提供了两种二叉树的例子:表达式树和决策树。
  • 关于二叉树的一些性质,例如,
    • 在二叉树的第i层最多有2i-1个节点
    • 深度为k的二叉树最多有2k-1个节点
    • 对于任何一个二叉树,若是其叶结点个数为n0,度为2的结点数尾n2,则有:n0=n2+1
  • 关于彻底二叉树的一些性质,例如,
    • 具备n个结点的彻底二叉树的高度为:log2n取下整数后+1
    • 若是将一个有n个结点的彻底二叉树自顶向下,同一层自左向右连续给结点编号1,2,...,n,则对于任意结点i(1<=i<=n),有:
      • i=1,则该i结点是树根,它无双亲;
      • 2i>n,则编号为i的节点无左孩子,不然它的左孩子是编号为2*i的结点;
      • 2i+1>n,则编号为i的结点无右孩子,不然右孩子的编号为2*i+1

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

  • 问题一:对于树的遍历问题,看了书之后感受不太明白,前序遍历、中序遍历、后序遍历、层序遍历这四个遍历在书上的解释不太清晰,看题之后也不太明白。
  • 问题一解决方案:在网上查询了相关的内容,获得了相应的解答。《二叉树的四种遍历方法笔记》。让我豁然开朗。

暂时没有遇到其余的问题。测试

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

  • 问题一:在编写PP10.5要求补全二叉树的contains方法时,第一次本身的代码以下
public boolean contains(T targetElement) {
        BinaryTreeNode current = root;
        BinaryTreeNode temp = root;
        boolean contains = false;
        if (current == null) {
            contains = false;
        }
        if (current.getElement().equals(targetElement)) {
            contains = true;
        }
        while (current.right != null)
        {
            if (current.right.getElement().equals(targetElement)) {
                contains = true;
            } else {
                current = current.right;
            }
        }
        while (temp.left != null)
        {
            if (temp.left.getElement().equals(targetElement))
            {
                contains = true;
            }
            else {
                temp = temp.left;
            }
        }
        return contains;
    }

这致使我测试该方法时只要是在判断非根节点就会出现程序一直运行没法中止的状况。设计

  • 问题一解决方案:仔细回顾了本身的代码,发现问题应该出如今while循环中,发现虽然我在代码中写到了若是查找/未找到到该元素就返回true/false而后返回该循环,没有跳出操做,致使程序一直运行。因此说我分别改成了
if(current.right.getElement().equals(taretElement)) {
            contains = true;
            break;
        }

if (temp.left.getElement().equals(targetElement))
        {
            contains = true;
            break;
        }

后便解决了该问题。

代码托管“点这里跳转到码云”

上周考试错题总结

上周没有测试,因此没有错题

结对及互评

  • 博客中值得学习的或问题:
    • 范雯琪同窗的博客课本上的学习内容总结部分写得十分详细,应该向她学习
  • 代码中值得学习的或问题:
    • commit提交的解释清晰明了,我以为我应该学习。

点评过的同窗博客和代码

其余

  • 感悟:在以前学习的基础上树的实现已经变得简单,只是迭代器和递归问题有些遗忘。

课本单词

(本部分用于收集本章节后的生词)

  • tree:树
  • node:节点
  • edge:边
  • root:根节点 最高层的节点
  • level:层
  • child:子节点
  • sibling:同胞节点
  • leaf:叶节点
  • internal node:内部结点
  • path:路径
  • ancestor:祖先节点 位于当前节点以上的节点
  • descendant:后代节点
  • path length:路径长度
  • tree height:树高度
  • tree order:树的阶
  • general tree:通常树 对子节点无限制的树
  • n-ary tree:n元树
  • binary tree:二叉树
  • balanced:平衡 若是全部叶节点都位于同一层,或至少位于其余某一层,就认为是平衡树
  • complete:彻底
  • full:完整
  • freelist
  • binary search tree:二叉查找树
  • preorder traversal:前序遍历
  • inorder traversal:中序遍历
  • postorder traversal:后序遍历
  • level-order traversal:层序遍历

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 0/5000 2/2 8/8 认真学习!积极向上
第二周 812/812 1/3 22/30
第三周 814/1626 1/4 20/50
第四周 1386/3012 2/6 20/70 愉快的国庆节就要结束了...
第五周 1222/3234 1/7 30/100
第六周 1327/4561 2/7 30/100 啦啦啦啦啦
  • 计划学习时间:30小时

  • 实际学习时间:30小时

  • 改进状况:规范commit行为。

参考资料

相关文章
相关标签/搜索