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()

其他(感悟、思考等)

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

参考资料

posted @ 2019-11-13 17:08  陆彦杰  阅读(167)  评论(0编辑  收藏  举报