• 20182307 2019-2020-1 《数据结构与面向对象程序设计》实验八报告


    20182307 2019-2020-1 《数据结构与面向对象程序设计》实验八报告

    课程:《程序设计与数据结构》
    班级: 1823
    姓名: 陆彦杰
    学号:20182307
    实验教师:王志强
    实验日期:2019年9月23日
    必修/选修: 必修

    1.实验内容

    • 参考教材PP16.1,完成链树LinkedBinaryTree的实现(getRight,contains,toString,preorder,postorder)
      • 用JUnit或自己编写驱动类对自己实现的LinkedBinaryTree进行测试,提交测试代码运行截图,要全屏,包含自己的学号信息
      • 课下把代码推送到代码托管平台
    • 基于LinkedBinaryTree,实现基于(中序,先序)序列构造唯一一棵二㕚树的功能,比如给出中序HDIBEMJNAFCKGL和后序ABDHIEJMNCFGKL,构造出附图中的树
      • 用JUnit或自己编写驱动类对自己实现的功能进行测试,提交测试代码运行截图,要全屏,包含自己的学号信息
      • 课下把代码推送到代码托管平台
    • 自己设计并实现一颗决策树
      • 提交测试代码运行截图,要全屏,包含自己的学号信息
      • 课下把代码推送到代码托管平台
    • 输入中缀表达式,使用树将中缀表达式转换为后缀表达式,并输出后缀表达式和计算结果(如果没有用树,正常评分。如果用到了树,即使有小的问题,也酌情给满分)
      • 提交测试代码运行截图,要全屏,包含自己的学号信息

    2. 实验过程及结果

    链树LinkedBinaryTree的实现

    • 实验目的:补全教材中LinkedBinaryTree类的方法(getRight,contains,isEmpty,toString,preorder,postorder),以及BTnode类的方法(preorder,postorder)
    • 实验思路
      • 根据类中已经存在的方法补全剩余的方法,如getRight可以参考getLeft,preorder,postorder可以参考inorder。而剩下的contains,isEmpty则可以通过调用BTnode中的方法来完成。
        1
    • 测试结果
      2

    中序先序序列构建二叉树

    • 实验目的:根据已知的先序与中序序列,构建唯一二叉树
    • 实验思路
      • 程序的基本原理是已知先序和中序、中序和后序可以确立一棵唯一二叉树。而已知先序和后序是不能确定的,因为左右子树可能不同。
      • 构建的基本思想:先序序列的第一个结点肯定是根节点,所以先在中序序列中找到相同的根节点,以它为划分左右分别为左右子树。
      • 再进行相似的步骤,先序序列的第二个元素就是左子树的第一个节点,再在中序序列中以它为中心划分左右子树,以此类推。
      • 构建完左边的整个子树后,以相同的原理构建右子树。
        3
    • 代码示例:
    public BTNode construct(char[] pre, char[] in){
          if (pre.length == 0 || in.length == 0) {
             return null;
          }
          BTNode<Character> tree = new BTNode<Character>(pre[0]);
          int index = search(0, in.length, in, tree.getElement());
          tree.setLeft(construct(Arrays.copyOfRange(pre, 1, index + 1), Arrays.copyOfRange(in, 0, index)));
          tree.setRight(construct(Arrays.copyOfRange(pre, index + 1, pre.length),
                  Arrays.copyOfRange(in, index + 1, in.length)));
          return tree;
       }
       
    public int search(int start, int end, char[] inOrders, char data) {
          for (int i = start; i < end; i++) {
             if (data == inOrders[i]) {
                return i;
             }
          }
          return -1;
       }
    

    设计并实现一棵决策树

    • 实验目的:决策树的实现
    • 实验思路:
      • 学习教材中的BackPainAnalyzer类与BackPainExpert类,模仿设计一棵简单的决策树
        4

    表达式树

    • 实验目的:使用树将中缀表达式转换为后缀表达式
    • 实验思路:先通过中缀表达式构建出一棵树,然后以后序遍历这棵树,得到的就是后缀表达式
      5

    3. 实验过程中遇到的问题和解决过程

    • 问题1:教材代码中的ArrayIterator类无法识别

      • 原因分析:Iterator模式是用于遍历集合类的标准访问方法。它可以把访问逻辑从不同类型的集合类中抽象出来,从而避免向客户端暴露集合的内部结构.每一种集合类返回的Iterator具体类型可能不同,例如setArray(array)就返回ArrayIterator
      • 解决方案:修改方法的定义类型为ArrayList
    • 问题2:设计决策树的时候,无法按变量命名顺序赋值

      • 原因分析:决策树的设计是自底向上的,所以要先定义决策树的叶子节点,然后再根据设计连接左右子树。所以如果变量赋值不按顺序是正常的。
      • 解决方案:按照自底向上的顺序定义变量并赋值
    • 问题3:测试代码中预期与实际显示相同却报错

      • 原因分析:类型不同,调用方法后输出的结果不是预期中设计的字符串型
      • 解决方案:在对象调用完方法后,再调用toString()方法,例如e.inorder().toString()

    其他(感悟、思考等)

    • 树是一个比较难掌握的数据结构,虽然上学期在离散课上接触过了,但知识掌握程度还停留在理论方面,真正代码实现的时候——特别是许多方法涉及递归算法的时候——我觉得还是很困难的,需要更多的实践去练习。

    参考资料

  • 相关阅读:
    数据比赛实现的细节
    matlab 构建数据集实用 api
    matlab 构建数据集实用 api
    新技能 get —— 如何校验 md5(windows)
    新技能 get —— 如何校验 md5(windows)
    中间件 —— 消息中间件(MOM)
    中间件 —— 消息中间件(MOM)
    详细说明svn分支与合并---命令行
    SVN 分支及合并的介绍和实践---命令行
    SVN中的Branches分支以及Merge 应用举例
  • 原文地址:https://www.cnblogs.com/algerlu/p/11851011.html
Copyright © 2020-2023  润新知