20202322 2021-2022-1 《数据结构与面向对象程序设计》实验八报告
# 20202322 2021-2022-1 《数据结构与面向对象程序设计》实验八报告
课程:《程序设计与数据结构》
班级: 2023
姓名: 袁艺匀
学号:20202322
实验教师:王志强
实验日期:2021年11月18日
必修/选修: 必修
## 1.实验内容
1.参考教材PP16.1,完成链树LinkedBinaryTree的实现(getRight,contains,toString,preorder,postorder)
用JUnit或自己编写驱动类对自己实现的LinkedBinaryTree进行测试,提交测试代码运行截图,要全屏,包含自己的学号信息
课下把代码推送到代码托管平台
2.基于LinkedBinaryTree,实现基于(中序,先序)序列构造唯一一棵二㕚树的功能,比如给出中序HDIBEMJNAFCKGL和后序ABDHIEJMNCFGKL,构造出附图中的树
用JUnit或自己编写驱动类对自己实现的功能进行测试,提交测试代码运行截图,要全屏,包含自己的学号信息
课下把代码推送到代码托管平台
3.自己设计并实现一颗决策树
提交测试代码运行截图,要全屏,包含自己的学号信息
课下把代码推送到代码托管平台
4.输入中缀表达式,使用树将中缀表达式转换为后缀表达式,并输出后缀表达式和计算结果(如果没有用树,正常评分。如果用到了树,即使有小的问题,也酌情给满分)
提交测试代码运行截图,要全屏,包含自己的学号信息
## 2. 实验过程及结果
1.参考教材PP16.1,完成链树LinkedBinaryTree的实现(getRight,contains,toString,preorder,postorder)
用JUnit或自己编写驱动类对自己实现的LinkedBinaryTree进行测试,提交测试代码运行截图,要全屏,包含自己的学号信息
课下把代码推送到代码托管平台
- getRight方法和getLeft是类似的
public LinkedBinaryTree<T> getRight() {
if (root==null)
throw new EmptyCollectionException("Get right operation"+"failed.The tree is empty.");
LinkedBinaryTree<T> result = new LinkedBinaryTree<>();
result.root=root.getRight();
return result;
}
- contains方法调用find方法,返回值则是boolean类型
public boolean contains(T target) {
BTNode<T> node = null;
if (root!=null)
node = root.find(target);
if (node==null)
return false;
else return true;
}
- preorder和postorder方法则和inorder方法不尽相似,但都是调用BTnode类的相应方法,并实现递归
public Iterator<T> preorder() {
ArrayIterator<T> iter = new ArrayIterator<>();
if (root!=null)
root.preorder(iter);
return iter;
}
public Iterator<T> inorder()
{
ArrayIterator<T> iter = new ArrayIterator<T>();
if (root != null)
root.inorder (iter);
return iter;
}
//BTnode
public void inorder(ArrayIterator<T> iter){
if (left!=null)
left.inorder(iter);
iter.add(element);
if (right!=null)
right.inorder(iter);
}
public void preorder(ArrayIterator<T> iter){
iter.add(element);
if (left!=null)
left.preorder(iter);
if (right!=null)
right.preorder(iter);
}
2.基于LinkedBinaryTree,实现基于(中序,先序)序列构造唯一一棵二㕚树的功能,比如给出中序HDIBEMJNAFCKGL和后序ABDHIEJMNCFGKL,构造出附图中的树
用JUnit或自己编写驱动类对自己实现的功能进行测试,提交测试代码运行截图,要全屏,包含自己的学号信息
课下把代码推送到代码托管平台
伪代码:
1.方法CreatTree(T [] pre,T [] inorder)传入两个数组,前序和中序
2.创建根节点传入参数为pre[0],利用Findposition方法找到根节点数据在中序中的位置。
3.分别创建数组来保存根据根节点所划分出的左右子树(左两个:先序和后序;右两个:先序和后序)
4.利用循环给创建的四个数组传入数据。
5.利用递归构建左子树,右子树。
真正的代码:
public LinkedBinaryTree<T> CreatTree(T [] pre,T [] inorder){
if (pre.length==0||inorder.length==0||pre.length!=inorder.length){
return null;
}
LinkedBinaryTree<T> mTree = new LinkedBinaryTree<>(pre[0]);
int num = Findpostion(pre[0],inorder);
T[] preLeft = (T[])(new Object[num]);
T[] inorderLeft = (T[])(new Object[num]);
T[] preRight = (T[])(new Object[pre.length-num-1]);
T[] inorderRight = (T[])(new Object[inorder.length-num-1]);
for(int j =0;j<inorder.length;j++){
if (j<num){
preLeft[j] = pre[j+1];
inorderLeft[j] = inorder[j];
}
else if (j>num){
preRight[j-num-1]=pre[j];
inorderRight[j-num-1]=inorder[j];
}
}
mTree.left= CreatTree(preLeft,inorderLeft);
mTree.right = CreatTree(preRight,inorderRight);
return mTree;
}
3.自己设计并实现一颗决策树,提交测试代码运行截图,要全屏,包含自己的学号信息,课下把代码推送到代码托管平台
public class QuesTwenty {
private LinkedBinaryTree<String> tree;
public QuesTwenty(){
String q1 = "Is it an animal?";
String q2 = "Is it a mammal?";
String q3 = "Is it an electrical appliance?";
String q4 = "Does it have fat pads at the bottom of its toes?";
String q5 = "Can it swim?";
String q6 = "Can it blow?";
String q7 = "Does it have a backrest?";
LinkedBinaryTree<String> n2,n3,n4,n5,n6,n7;
n4 = new LinkedBinaryTree<>(q4);
n5 = new LinkedBinaryTree<>(q5);
n2 = new LinkedBinaryTree<>(q2,n4,n5);
n6 = new LinkedBinaryTree<>(q6);
n7 = new LinkedBinaryTree<>(q7);
n3 = new LinkedBinaryTree<>(q3,n6,n7);
tree = new LinkedBinaryTree<>(q1,n2,n3);
}
public void diagnose(){
Scanner scan = new Scanner(System.in);
LinkedBinaryTree<String> current = tree;
System.out.println("OK? the items have Dog, cat, chicken, duck, fan, TV chair, bookcase");
while(current.size()>1){ System.out.println(current.getRootElement());
if (scan.nextLine().equalsIgnoreCase("N")){
current=current.getLeft();
}
else current = current.getRight();
}
System.out.println(current.getRootElement());
System.out.println("You have run out all the questions , do you know the answer");
}
}
4.输入中缀表达式,使用树将中缀表达式转换为后缀表达式,并输出后缀表达式和计算结果(如果没有用树,正常评分。如果用到了树,即使有小的问题,也酌情给满分)
提交测试代码运行截图,要全屏,包含自己的学号信息