20202302 2021-2022-1 《数据结构与面向对象程序设计》实验八报告
课程:《程序设计与数据结构》
班级: 2023
姓名: 吉相融
学号:20202302
实验教师:王志强
实验日期:2021年11月24日
必修/选修: 必修
1.实验内容
-
参考教材PP16.1,完成链树LinkedBinaryTree的实现(getRight,contains,toString,preorder,postorder)
用JUnit或自己编写驱动类对自己实现的LinkedBinaryTree进行测试,提交测试代码运行截图,要全屏,包含自己的学号信息
课下把代码推送到代码托管平台 -
基于LinkedBinaryTree,实现基于(中序,先序)序列构造唯一一棵二㕚树的功能,比如给出中序HDIBEMJNAFCKGL和后序ABDHIEJMNCFGKL,构造出附图中的树
用JUnit或自己编写驱动类对自己实现的功能进行测试,提交测试代码运行截图,要全屏,包含自己的学号信息
课下把代码推送到代码托管平台 -
自己设计并实现一颗决策树
提交测试代码运行截图,要全屏,包含自己的学号信息
课下把代码推送到代码托管平台 -
输入中缀表达式,使用树将中缀表达式转换为后缀表达式,并输出后缀表达式和计算结果(如果没有用树,正常评分。如果用到了树,即使有小的问题,也酌情给满分)
提交测试代码运行截图,要全屏,包含自己的学号信息
2.实验过程及结果
2.1 实现二叉树
代码码云地址:
https://gitee.com/jixiangrong/jxr20202302/blob/master/%E5%AE%9E%E9%AA%8C%E5%85%AB/BTNode.java
https://gitee.com/jixiangrong/jxr20202302/blob/master/%E5%AE%9E%E9%AA%8C%E5%85%AB/BinaryTree.java
https://gitee.com/jixiangrong/jxr20202302/blob/master/%E5%AE%9E%E9%AA%8C%E5%85%AB/ElementNotFoundException.java
https://gitee.com/jixiangrong/jxr20202302/blob/master/%E5%AE%9E%E9%AA%8C%E5%85%AB/EmptyCollectionException.java
https://gitee.com/jixiangrong/jxr20202302/blob/master/%E5%AE%9E%E9%AA%8C%E5%85%AB/LinearNode.java
https://gitee.com/jixiangrong/jxr20202302/blob/master/%E5%AE%9E%E9%AA%8C%E5%85%AB/LinkedBinaryTree1.java
https://gitee.com/jixiangrong/jxr20202302/blob/master/%E5%AE%9E%E9%AA%8C%E5%85%AB/LinkedBinaryTree1Test.java
https://gitee.com/jixiangrong/jxr20202302/blob/master/%E5%AE%9E%E9%AA%8C%E5%85%AB/LinkedQueue.java
https://gitee.com/jixiangrong/jxr20202302/blob/master/%E5%AE%9E%E9%AA%8C%E5%85%AB/QueueADT.java
教材上的代码需要补充,无法正常运行,故在加入了数个异常抛出程序,以及QueueADT后,LinkedBinaryTree1以及它的测试代码得以实现,实现效果如下图:
2.2 中序、先序序列构造二叉树
代码码云地址:
https://gitee.com/jixiangrong/jxr20202302/blob/master/%E5%AE%9E%E9%AA%8C%E5%85%AB/LinkedBinaryTree2.java
https://gitee.com/jixiangrong/jxr20202302/blob/master/%E5%AE%9E%E9%AA%8C%E5%85%AB/LinkedBinaryTree2Test.java
中序、先序序列构造二叉树的代码基于2.1,用LinkedBinaryTree2加以区分。并用LinkedBinaryTree2Test进行测试,测试结果如下图:
2.3决策树
决策树(Decision Tree)是在已知各种情况发生概率的基础上,通过构成决策树来求取净现值的期望值大于等于零的概率,评价项目风险,判断其可行性的决策分析方法,是直观运用概率分析的一种图解法
决策树的代码基于2.2,测试结果如下图所示:
代码码云地址:
https://gitee.com/jixiangrong/jxr20202302/blob/master/%E5%AE%9E%E9%AA%8C%E5%85%AB/DecisionTree.java
https://gitee.com/jixiangrong/jxr20202302/blob/master/%E5%AE%9E%E9%AA%8C%E5%85%AB/Expert.java

2.4树与表达式
代码码云地址:
https://gitee.com/jixiangrong/jxr20202302/blob/master/%E5%AE%9E%E9%AA%8C%E5%85%AB/InToPose.java
https://gitee.com/jixiangrong/jxr20202302/blob/master/%E5%AE%9E%E9%AA%8C%E5%85%AB/InToPoseTest.java
https://gitee.com/jixiangrong/jxr20202302/blob/master/%E5%AE%9E%E9%AA%8C%E5%85%AB/PoseCalculate.java
使用栈将中缀表达式转换为后缀表达式,测试单元输出为后缀表达式。测试结果如下图:
3. 实验过程中遇到的问题和解决过程
1.课本上的代码都是骗人的!!!好多东西都要自己补充,搞得人头皮发麻!!
2.还是T类型的引用上总是飘红(历史遗留问题了属于是)。后发现是因为Iterator模式是用于遍历集合类的标准访问方法,在本实验中将ArrayIterator改成ArrayList也可,实验也可以完成。
其他(感悟、思考等)
本次实验,涉及到如何去构建树,决策树、表达式树等,加深了我对树这一结构的理解,同时也意识到树作为一种结构有时在运算和查找时的确具有一定优势,有时候确实更加高效。而在2.4中,表达式后缀我没能用树实现,而是利用栈“先进后出”性质去做,虽说有点遗憾,但效果还是很圆满的。
不过写代码是真的好难好难.......
最后,还是要感谢程序员前辈在网上上传的各类代码,以及各位同学、学长、还有老师提供代码的帮助。(比心)
参考资料
[《Java程序设计与数据结构教程(第二版)》](https://book.douban.com/subject/26851579/)
CSDN