20202303 实验八《数据结构与面向对象程序设计》实验报告

# 20202303  2021-2022-1 《数据结构与面向对象程序设计》实验八报告

课程:《程序设计与数据结构》
班级: 2023
姓名: 马澜
学号:20202303
实验教师:王志强
实验日期:2021年11月208日
必修/选修: 必修

## 1.实验内容

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

## 2. 实验过程及结果
(1)参考教材PP16.1,完成链树LinkedBinaryTree的实现(getRight,contains,toString,preorder,postorder)

  • 用JUnit或自己编写驱动类对自己实现的LinkedBinaryTree进行测试,提交测试代码运行截图,要全屏,包含自己的学号信息
  • 课下把代码推送到代码托管平台

     根据类中已经存在的方法补全剩余的方法,如getRight可以参考getLeft,preorder,postorder可以参考inorder。而剩下的contains,isEmpty则可以通过调用BTNode中的方法来完成。

 

 

 接下来是测试代码的通过(学号测试):

 

 

(2)基于LinkedBinaryTree,实现基于(中序,先序)序列构造唯一一棵二㕚树的功能,比如给出中序HDIBEMJNAFCKGL和后序ABDHIEJMNCFGKL,构造出附图中的树

  • 用JUnit或自己编写驱动类对自己实现的功能进行测试,提交测试代码运行截图,要全屏,包含自己的学号信
  • 课下把代码推送到代码托管平台

       程序的基本原理是已知先序和中序、中序和后序可以确立一棵唯一二叉树。而已知先序和后序是不能确定的,因为左右子树可能不同。构建的基本思想:先序序列的第一个结点肯定是根节点,所以先在中序序列中找到相同的根节点,以它为划分左右分别为左右子树。再进行相似的步骤,先序序列的第二个元素就是左子树的第一个节点,再在中序序列中以它为中心划分左右子树,以此类推。构建完左边的整个子树后,以相同的原理构建右子树。

 

 

  • 代码示例:
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;
   }

 

(3)自己设计并实现一颗决策树

  • 提交测试代码运行截图,要全屏,包含自己的学号信息
  • 课下把代码推送到代码托管平台

 

 

 测试代码:

 

 

(4)输入中缀表达式,使用树将中缀表达式转换为后缀表达式,并输出后缀表达式和计算结果(如果没有用树,正常评分。如果用到了树,即使有小的问题,也酌情给满分)

  • 提交测试代码运行截图,要全屏,包含自己的学号信息

 先通过中缀表达式构建出一棵树,然后以后序遍历这棵树,得到的就是后缀表达式

 

## 3. 实验过程中遇到的问题和解决过程
- 问题1:在程序编写中,IDEA证书过期了,真的无语。。。。。
- 问题1解决方案:利用现代网络的发达技术,终于换成了无限循环式使用,怒赞网络这个宽阔的平台。
- 问题2:在编写过程中,教材代码中的ArrayIterator类无法识别

- 问题2解决方案:通过网络搜索以及搜索,发现把这个方法的定义类型为ArrayList就可以啦。
- 问题3:在测试过程中,发现最开始的编写与自己预期的出现顺序不一致,过不了。

 

- 问题3解决方案:在对象调用完方法后,再调用toString()方法,将两者结合起来,比如文上的e.inorder().toString()


## 其他

感悟:树的结构其实大部分在离散里也接触过,虽然但是,我万万没想到要把这个东西做成程序,虽然有课本,但耐不住本人脑子有限,在实践方面还差缺火候,尤其是在许多方法补充的方面,特别吃力,而且写出来也其实没咋记住和理解,尤其是递归算法,要了老命了,还是希望下次难度低一点,我会之后努力实践,然后继续加油!


## 参考资料

-  《Java程序设计教程(第九版)》

-  《Java软件结构与数据结构(第四版)》

 
- 网页搜索资料:https://blog.csdn.net/qq_26219679/article/details/79647221

- 网页搜索资料:https://blog.csdn.net/weixin_30384217/article/details/99115000

- 云班课:https://www.cnblogs.com/rocedu/p/6371262.html

posted @ 2021-11-27 21:40  20202303马澜  阅读(62)  评论(0编辑  收藏  举报