20172310 2017-2018《程序设计与数据结构》(下)第六周学习总结

20172310 2017-2018《程序设计与数据结构》(下)第六周学习总结

教材学习内容总结

非线性集合与数据结构,树的使用和实现。html

概述(树的一些基本概念)

  • 树(tree)是一种非线性结构,其中元素被组织成了一个层次结构。
  • 树由一个包含结点(node)和边(edge)的集构成。元素被存储在这些结点中,边将一个结点和另外一个结点链接起来。
  • 每一结点都位于该树层次结构中的某一特定层上。树的根(root)就是那个位于该树顶层的惟一结点。
  • 位于树中较低层的结点是上一层结点的孩子( children)。
  • 一个结点只有一个双亲,可是一个结点能够有多个孩子。同一双亲的两个结点称为兄弟( sibling)。根结点是树中惟一一个没有双亲的结点。没有任何孩子的结点称为叶子(leaf)。一个至少有一个孩子的非根结点称为一个内部结点( internal node)。
  • 树的类比是上下倒置的。
  • 根是树结构的进入点。咱们能够沿着一条经过该树的路径从双亲到达孩子。
  • 假如A在从根开始的路径中位于另外一结点B之上,则A就是B 的祖先( ancestor)。根是树中全部结点的最终祖先。沿着起始自某一特定结点的路径能够到达的结点是该结点的子孙( descendant)。
  • 结点的层也就是从根结点到该结点的路径长度。经过计算从根到该结点所必须越过的边数目,就能够肯定其路径长度( path length)。根是位于层0的。
  • 树的高度( height)是指从根到叶子之间最远路径的长度。

树的分类

  • n元树:
    • 树中任一结点能够具备的最大孩子数目,这个值有时候也称为该树的度( order)。对结点所含有的孩子数目无限制的树称为广义树( general tree)。咱们将每一结点限制为不超过n个孩子的树称为一棵n元树( n-ary tree)。
    • 结点最多具备两个孩子的树称为二叉树( binary tree)。

      平均二叉树的高度要比N小得多。分析代表,这个平均高度为O(√N),而对于二叉查找树(binary search tree),其高度的平均值是O(log N)。
  • 平衡树:
    • 若是树的全部叶子都位于同一层或者至少是彼此相差不超过一个层,就称之为是平衡的。
  • 彻底树和满树:
    • 在树是平衡树的基础上,底层全部叶子都位于树的左边,则认为该树是彻底的。若是一棵n元树的全部叶子都位于同一层且每一个结点要么是一片叶子要么正好具备n个孩子,则称此树是满的。

实现树的策略

  • 树的数组实现之计算策略
    :一种可能的计算策略是将元素n的左孩子置于位置(2×n+1),将右孩子置于位置(2×(n+1))(特别是对二叉树的实现)
    但有些缺陷:若是咱们存储的树不是彻底的或只是相对彻底的,则该数组会为不包含数据的树位置分配空间,这就浪费了大量的存储空间。
    java

  • 树的数组实现之模拟连接策略
    :第二个可能策略模拟了操做系统管理内存的方式。容许连续分配数组位置而不用考虑该树的彻底性,该数组的每一元素都是一个结点类,每一结点存储的将是每一孩子(可能还有其双亲)的数组索引,而不是做为指向其孩子(可能还有其双亲)指针的对象引用变量。
    缺陷:增长了删除树中元素的成本,由于它要么须要对剩余元素进行移位以维
    持连续状态,要么须要保留一个空闲列表。node

树的遍历

遍历一棵树有4种基本方法:




git

二叉树

  • 二叉树性质
    • 性质1:在二叉树的第i层上至多有2^i-1个结点(i>=1)。
    • 性质2:深度为k的二叉树至多有2^k-1个结点(k>=1)。
    • 性质3:对任何一颗二叉树T,若是其叶结点数为n0,度为2的 结点 数为n2,则n0 = n2+1。
  • 两种特殊的二叉树(1)数组

    • 满二叉树( Full Binary Tree ) :每层都“充满”告终点。深度为k,结点总数2^k-1,每层结点数2^i-1
      数据结构

    • 彻底二叉树( Complete Binary Tree ):树中所含的n个结点和满二叉树中编号为1至n的结点一一对应。(满二叉树去掉最下层最右边若干结点)
      ide

  • 彻底二叉树的性质
    • 性质1:具备n个结点的彻底二叉树深度为[log2n]+1 ([log2n]表示不 大于log2n的最大整数)。
    • 性质2:若是对一颗有n个结点的彻底二叉树(其深度为[log2n]+1) 的结点按层序编号(从第1层到第[log2n]+1层,每层从左到右),对任意一个结点i(1<=i<=n)有:
  • 对二叉树的一些操做:
    学习

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

  • 问题1:树的高度和深度的区别?老师上课时重复提到了这两个概念,计算中很容易混淆这两个概念,那这两个概念究竟是什么呢?
  • 问题1解决方案:lua

    高度的定义课本给出的是指从根到叶子之间最远路径的长度。还有的说法是从结点x向下到某个叶结点最长简单路径中边的条数idea

就像是拿楼房来讲,假如一我的提问:楼房的高度有多高?咱们会从底层开始往上数,假如楼有6层,则咱们会说,这个楼有6层楼那么高。
课本上的例子A到F有四层,可是却说他的高度为3。

我在网上看了一些别的例子
人家给出的A到K的高度却为5。

因此我理解其实高度这个主要是因为其根是1层仍是0层产生了不一样,但不少时候按习惯来讲通常都是以1开始。

深度是从根节点往下,深度是从根节点开始(其深度为1)自顶向下逐层累加的。

总的来讲对于整棵树来讲,最深的叶结点的深度就是树的深度;树根的高度就是树的高度。这样树的高度和深度是相等的。
对于树中相同深度的每一个结点来讲,它们的高度不必定相同,这取决于每一个结点下面的叶结点的深度。

  • 问题2:书中代码的理解
public int evaluateNode(BinaryTreeNode root)
    {
        int result, operand1, operand2;
        ExpressionTreeOp temp;

        if (root==null)
            result = 0;
        else
        {
            temp = (ExpressionTreeOp)root.getElement();

            if (temp.isOperator())//判断temp是不是一个操做符,若是是一个操做数,进入循环,递归
            {
                operand1 = evaluateNode(root.getLeft());
                operand2 = evaluateNode(root.getRight());
                result = computeTerm(temp.getOperator(), operand1, operand2);
            }
            else//若是是操做符,则返回值
                result = temp.getValue();
        }

        return result;
    }
  • 问题2的解决方案:isOperator()方法是写在ExpressionTreeOp类中
public boolean isOperator() 
    {
        return (termType == 1);
    }

相应的解释就在代码后加入了本身的理解。

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

  • 问题1:
    给出的信息是在循环出出现了错误,可是循环的代码并没用问题。就跟在打印二叉树的表达树时,也出现了错误

是最根本的LinkedBinaryTree.java文件中的方法发生了错误,因而进行了调试

发现GetRight和GetLeft的返回值是错误的,继续发现原来是没有编写成功height()方法。

  • 问题1解决方案:因而就进行了以下的更改。

最后得出了正确的显示

代码托管

上周考试错题总结

上周已总结。

结对及互评

点评:

  • 本周结对学习状况
  • 博客和代码中值得学习的或问题:
  • 教材中的问题总结的很详细,第一个问题,由于课本上都是用的二叉树为例子,可是

    那么当一个节点只有一个孩子的时候,此时没有左右孩子之分。

我以为就算没有两个或以上的孩子,但也能根据位置来肯定相对的左右。图的画法好像有点错。此外,结果好像也有点问题,若是它不是左孩子,那么会先访问该节点,因此我认为答案是D、H、B、E、A、F、C、G。

格式好像有点问题。

  • 对课本教材的代码理解很好。

点评过的同窗博客和代码

其余(感悟、思考等,可选)

第十章内容真的是又多又难呀,树是新接触的概念,其中有不少的细小的知识和概念要去理解,在总结和记忆这些小知识点上花的时间仍是不少的。此外,这章的代码其实很难理解,咱们上个学期学了迭代,但说句实话,内容都有些忘了,并且这章不只使用了迭代,并且代码的逻辑,代码为何这样写都有些难以理解,书上的代码有些都由于时间限制,就先囫囵吞枣了一番,以后才慢慢理解了。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积)
目标 5000行 30篇 400小时
第一周 0/0 1/1 10/10
第二周 326/326 1/2 18/28
第三周 784/1110 1/3 25/53
第四周 2529/3638 2/5 37/90
第五周 1254/4892 2/7 20/110
第六周 1403/6295 2/9 32/142
  • 计划学习时间:30小时

  • 实际学习时间:32小时

  • 改进状况:
    这周由于学习内容较多,因此时间也较长,但仍是要提升一下学习的效率。

参考资料

相关文章
相关标签/搜索