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