20192316 2020-2021-1 《数据结构与面向对象程序设计》实验八报告
20192316 2020-2021-1 《数据结构与面向对象程序设计》实验八报告
课程:《程序设计与数据结构》
班级: 1923
姓名: 贝世之
学号:20192316
实验教师:王志强
实验日期:2020年12月3日
必修/选修: 必修
1. 实验内容
-
参考教材PP16.1,完成链树LinkedBinaryTree的实现(getRight,contains,toString,preorder,postorder)
用JUnit或自己编写驱动类对自己实现的LinkedBinaryTree进行测试,提交测试代码运行截图,要全屏,包含自己的学号信息
课下把代码推送到代码托管平台 -
基于LinkedBinaryTree,实现基于(中序,先序)序列构造唯一一棵二㕚树的功能,比如给出中序HDIBEMJNAFCKGL和后序ABDHIEJMNCFGKL,构造出附图中的树
用JUnit或自己编写驱动类对自己实现的功能进行测试,提交测试代码运行截图,要全屏,包含自己的学号信息
课下把代码推送到代码托管平台 -
自己设计并实现一颗决策树
提交测试代码运行截图,要全屏,包含自己的学号信息
课下把代码推送到代码托管平台 -
输入中缀表达式,使用树将中缀表达式转换为后缀表达式,并输出后缀表达式和计算结果(如果没有用树,正常评分。如果用到了树,即使有小的问题,也酌情给满分)
提交测试代码运行截图,要全屏,包含自己的学号信息
2. 实验过程及结果
2.1 实现二叉树
参考教材PP16.1,发现有多处报错,无法完成链树LinkedBinaryTree的实现。修改ArrayIterator类为ArrayList类,同时补充代码如下:
- 因为可能出现内容为空的情况,所以需要抛出错误EmptyCollectionException。
- 因为可能出现查找内容不存在的情况,所以需要抛出错误ElementNotFoundException。
- 层序输出需要用到队列的方法,将一层的结点先依次存入之后,再依次get该层每个结点的左右孩子,实现递归。因此需要引入QueueADT接口,借助LinearNode辅助LinkedQueue完成层序输出。
- 结合以上补充,略微更改书本代码BTNode、BinaryTree接口以及LinkedBinaryTree后用测试单元对GetRight、Contains、ToString、Preorder、LevelOrder、GetRootElement、Postorder、Size、IsEmpty、Find功能进行测试。
- 运行截图如下
2.2 中序、先序序列构造二叉树
- 本实验基于2.1的代码。
- 同时为了避免覆盖8.1的代码,这里LinkedBinaryTree2在LinkedBinaryTree1的基础上增加了实现基于(中序,先序)序列构造唯一一棵二㕚树的功能,并用后序输出作为测试,可以证明该二叉树是唯一的。
- 运行截图如下
2.3 决策树
2.4 表达式树
- 本实验使用栈将中缀表达式转化成后缀表达式。
- 将后缀表达式中的数据逐一取出入栈,遇到运算符时出栈计算,再将计算结果入栈,直至出栈时栈为空抛出错误,最后一次的计算结果即为算式的答案。
- 在测试单元将中缀表达式转换为后缀表达式,并输出后缀表达式和计算结果。
- 运行截图如下
3. 实验过程中遇到的问题和解决过程
-
问题1:BTNode中的ArrayIterator无法使用,
与add标红。
-
问题1解决方案:Iterator模式是用于遍历集合类的标准访问方法。在本实验中将ArrayIterator改成ArrayList同样可达到目的。
-
问题2:运用后缀表达式计算时,一开始卡在出栈报错以及死循环上。
-
问题2解决方案:使用try catch出栈错误是break。
其他(感悟、思考等)
此次试验涉及到了树的构建、通过先序与中序构造树还有决策树的构建。虽然在最后一个实验中我没能用树的结构来实现,但是通过栈来完成实验让我对栈以及StringTokenizer的理解更深刻了。