20172304 实验二报告
- 课程:《软件结构与数据结构》
- 班级: 1723
- 姓名: 李馨雨
- 学号:20172328
- 实验教师:王志强
- 助教:张师瑜&张之睿
- 实验日期:2018年11月5日-2018年11月12日
必修选修: 必修
实验要求
实验一:实现二叉树
参考教材p212,完成链树LinkedBinaryTree的实现(getRight,contains,toString,preorder,postorder)
用JUnit或自己编写驱动类对自己实现的LinkedBinaryTree进行测试,提交测试代码运行截图,要全屏,包含自己的学号信息
课下把代码推送到代码托管平台
实验二:中序先序序列构造二叉树
基于LinkedBinaryTree,实现基于(中序,先序)序列构造唯一一棵二㕚树的功能,比如给出中序HDIBEMJNAFCKGL和后序ABDHIEJMNCFGKL,构造出附图中的树,用JUnit或自己编写驱动类对自己实现的功能进行测试,提交测试代码运行截图,要全屏,包含自己的学号信息
实验三:决策树
自己设计并实现一颗决策树,提交测试代码运行截图,要全屏,包含自己的学号信息,课下把代码推送到代码托管平台
实验四:表达式树
输入中缀表达式,使用树将中缀表达式转换为后缀表达式,并输出后缀表达式和计算结果(如果没有用树,则为0分),提交测试代码运行截图,要全屏,包含自己的学号信息,课下把代码推送到代码托管平台
实验五:二叉查找树
完成PP11.3,提交测试代码运行截图,要全屏,包含自己的学号信息,课下把代码推送到代码托管平台
实验六 : 红黑树分析
参考本博客:点击进入对Java中的红黑树(TreeMap,HashMap)进行源码分析,并在实验报告中体现分析结果。实验过程及实验结果
实验一过程及结果:
LinedBinaryTree码云链接
测试类及测试结果
package week6.jsjf;
public class LinkedBinaryTreeTest {
public static void main(String[] args) throws InterruptedException {
LinkedBinaryTree c=new LinkedBinaryTree("b");LinkedBinaryTree b=new LinkedBinaryTree("c");LinkedBinaryTree a=new LinkedBinaryTree("Translation",c,b);
LinkedBinaryTree e=new LinkedBinaryTree("F");
LinkedBinaryTree f=new LinkedBinaryTree("g",a,e);
System.out.println("二叉树的toString方法");
System.out.println(f.toString());
System.out.println("二叉树的先序遍历");
f.preorder(f.getRootNode());
System.out.println();
System.out.println("二叉树的后序遍历");
f.postorder(f.getRootNode());
System.out.println();
System.out.println("二叉树的中序遍历");
f.Inorder(f.getRootNode());
System.out.println();
System.out.println("二叉树的层序遍历");
f.unrecursionlevelOreder(f.getRootNode());
System.out.println();
System.out.println( "查找是否包含a的结果:"+f.contains("Translation")+"二叉树中的元素:"+"b, c, Translation, F, g");
System.out.println("查找是否包含A的结果:"+f.contains("A")+"二叉树中的元素:"+"b, c, Translation, F, g");
System.out.println("getRight方法的检验,即输出树的根节点的右子树");
System.out.println(f.getRight().toString());
System.out.println("getLeft方法的检验,即输出树的根节点的左子树");
System.out.println(f.getLeft().toString());
System.out.println("二叉树的高度:"+f.getHeight()+"二叉树的元素个数:"+f.size()+"二叉树的根元素"+f.getRootElement());
}
}
实验二
这个实验要求的是通过给定的中缀表达式和后缀表达式构建二叉树题目中给定了中序HDIBEMJNAFCKGL和先序ABDHIEJMNCFGKL。
我们由先序知道二叉树的根节点是为A,在中序遍历中就可以知道以A为根节点的左子树为“HDIBEMJN”,右子树为“FCKGL”。由于我是使用数组记录的两个序列。所以在每一次确定完根节点以后,我就会更新数组的指针,在通过递归依次确定左子树的根节点和右子树的根节点,在进行过几次递归之后。就可以得到以中序遍历以及先序遍历为基础的二叉树了。
测试结果
BTCreation码云链接
实验三
决策树,这个的实现是基于书上的代码,这个实际上也没有也没有太大的难度
DecisionTree码云链接
CharacterAnalyzer
这是我设计的决策树
测试结果
实验四
这个实验主要要求是通过二叉树将中缀表达式转为后缀表达式,输出并计算后缀表达式并计算后缀表达式的结果。
实验分析:书上已经有了将后缀表达式构建二叉树并计算的方法了,实际上饿哦们只需要将中缀表达式按照优先级的顺序录入二叉树中,就可以调用树中的方法计算并得到结果了。然后我就做了实际上原理与那个直接中缀转后缀相仿。
码云链接
Translation
测试结果截图
测试代码
public static void main(String[] args) {
Translation translation =new Translation();
String a="8 / 4 - 9 + 11 * 2";
translation.Translate(a);
System.out.println("中缀表达式树是");
System.out.println(translation.getTree());
System.out.println("后序遍历是"+translation.PostOrder());
System.out.println("结果是"+translation.getResult());
}
实验五
这个实验主要就是测试一下没有什么好讲的
码云链接
LinkedBinarySearchTree
测试代码
package week7.jsjf;
public class LinkedBinarySearchTreeTest {
public static void main(String[] args) throws InterruptedException {
LinkedBinarySearchTree a=new LinkedBinarySearchTree();
a.addElement(80);
a.addElement(10);
a.addElement(9);
a.addElement(6);
a.addElement(7);
a.addElement(85);
a.addElement(16);
a.addElement(44);
System.out.println(a.toString());
System.out.println(a.findMax());
System.out.println(a.findMin());
System.out.println(a.find(85));
a.removeElement(10);
System.out.println(a.toString());
a.removeMax();
System.out.println(a.toString());
a.removeMin();
System.out.println(a.toString());
}
}
测试结果
实验六