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

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

课程:《程序设计与数据结构》
班级: 1923
姓名: 贝世之
学号:20192316
实验教师:王志强
实验日期:2020年12月3日
必修/选修: 必修

1. 实验内容

  1. 参考教材PP16.1,完成链树LinkedBinaryTree的实现(getRight,contains,toString,preorder,postorder)
    用JUnit或自己编写驱动类对自己实现的LinkedBinaryTree进行测试,提交测试代码运行截图,要全屏,包含自己的学号信息
    课下把代码推送到代码托管平台

  2. 基于LinkedBinaryTree,实现基于(中序,先序)序列构造唯一一棵二㕚树的功能,比如给出中序HDIBEMJNAFCKGL和后序ABDHIEJMNCFGKL,构造出附图中的树
    用JUnit或自己编写驱动类对自己实现的功能进行测试,提交测试代码运行截图,要全屏,包含自己的学号信息
    课下把代码推送到代码托管平台

  3. 自己设计并实现一颗决策树
    提交测试代码运行截图,要全屏,包含自己的学号信息
    课下把代码推送到代码托管平台

  4. 输入中缀表达式,使用树将中缀表达式转换为后缀表达式,并输出后缀表达式和计算结果(如果没有用树,正常评分。如果用到了树,即使有小的问题,也酌情给满分)
    提交测试代码运行截图,要全屏,包含自己的学号信息

2. 实验过程及结果

2.1 实现二叉树

参考教材PP16.1,发现有多处报错,无法完成链树LinkedBinaryTree的实现。修改ArrayIterator类为ArrayList类,同时补充代码如下:

  • 因为可能出现内容为空的情况,所以需要抛出错误EmptyCollectionException
  • 因为可能出现查找内容不存在的情况,所以需要抛出错误ElementNotFoundException
  • 层序输出需要用到队列的方法,将一层的结点先依次存入之后,再依次get该层每个结点的左右孩子,实现递归。因此需要引入QueueADT接口,借助LinearNode辅助LinkedQueue完成层序输出。
  • 结合以上补充,略微更改书本代码BTNodeBinaryTree接口以及LinkedBinaryTree后用测试单元对GetRight、Contains、ToString、Preorder、LevelOrder、GetRootElement、Postorder、Size、IsEmpty、Find功能进行测试。
  • 运行截图如下

2.2 中序、先序序列构造二叉树

  • 本实验基于2.1的代码。
  • 同时为了避免覆盖8.1的代码,这里LinkedBinaryTree2在LinkedBinaryTree1的基础上增加了实现基于(中序,先序)序列构造唯一一棵二㕚树的功能,并用后序输出作为测试,可以证明该二叉树是唯一的。
  • 运行截图如下

2.3 决策树

  • 本实验基于2.2的LinkedBinaryTree2构造决策树
  • 测试单元启动决策树。
  • 运行截图如下

2.4 表达式树

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

  • 问题1:BTNode中的ArrayIterator无法使用,与add标红。

  • 问题1解决方案:Iterator模式是用于遍历集合类的标准访问方法。在本实验中将ArrayIterator改成ArrayList同样可达到目的。

  • 问题2:运用后缀表达式计算时,一开始卡在出栈报错以及死循环上。

  • 问题2解决方案:使用try catch出栈错误是break。

其他(感悟、思考等)

此次试验涉及到了树的构建、通过先序与中序构造树还有决策树的构建。虽然在最后一个实验中我没能用树的结构来实现,但是通过栈来完成实验让我对栈以及StringTokenizer的理解更深刻了。

参考资料

posted on 2020-12-09 20:41  王老师铁杆粉  阅读(162)  评论(0编辑  收藏  举报

导航