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.输入中缀表达式,使用树将中缀表达式转换为后缀表达式,并输出后缀表达式和计算结果(如果没有用树,正常评分。如果用到了树,即使有小的问题,也酌情给满分)
提交测试代码运行截图,要全屏,包含自己的学号信息

 

 

posted @ 2021-11-28 21:26  20202322袁艺匀  阅读(10)  评论(0编辑  收藏  举报