实验二实验报告

实验过程

实验2.1

  • 实验内容:

    • 参考教材p375,完成链树LinkedBinaryTree的实现(getRight,contains,toString,preorder,postorder)

    • 用JUnit或自己编写驱动类对自己实现的LinkedBinaryTree进行测试,提交测试代码运行截图,要全屏,包含自己的学号信息

  • 实验过程

    • 这个实验主要是完善书上已给出的几个代码,再针对它们写一个测试类或者驱动类来验证编写类的正确性即可。在BTNode里面有中序遍历方法,下面留下来先序和后序给我们自己完善,这个课上已经讲过了。而在LinkedBinaryTree中剩下的几个方法在前面都有类似的参照。对比着完成了。
  • 遇到的困难及解决方法:

    • 这次的测试类里面我创建的是一个驱动测试类而不是以前一直用的单元测试,第一次输出的先后序遍历结果有错误,经过代码复查,我发现我在编写BTNode里面的preord和postord方法的时候时是照着中序写的,left.inorder这种调用没有改成相应的顺序表达式方法,如下面应调用left.preorder。修改完毕后测试驱动类的构建输出的结果和asserEqual测试过的方法均正确。
    public void preorder(ArrayIterator<T> iter) {
       iter.add(element);
       if (left!=null)
         left.preorder(iter);
       if (right!=null)
         right.preorder(iter);
    } 

image

实验2.2

  • 实验内容:

    • 基于LinkedBinaryTree,实现基于(中序,先序)序列构造唯一一棵二㕚树的功能,比如教材P372,给出HDIBEMJNAFCKGL和ABDHIEJMNCFGKL,构造出附图中的树

    • 用JUnit或自己编写驱动类对自己实现的功能进行测试,提交测试代码运行截图,要全屏,包含自己的学号信息。

  • 实验过程

    • 这个实验我是根据CSDN上别人发布的一个java的中先序构数的代码来完成的,原代码里输出的是Integer类型,我通过把设置的结点和方法全部换成String后就可以完成实验2.2的要求了。核心代码学习:这个代码的核心方法跟我在上课中学到的,在学习博客总结中总结的类似:用先序的第一个元素也就是根将中序表达式分割为左右子树,再根据左右子树的根结点继续划分成更小的子树,在划分到最小单元也就是prestart=preend,instart=inend时,也就是先后序遍历到的最小树长度为1时:返回的都是叶子结点。返回这些结点就可以输出树。同样采用了递归的思路。
public static TreeNode reConstructBinaryTreeCore(String[] pre, String[] in, int preStart, int preEnd, int inStart, int inEnd) {
        TreeNode tree = new TreeNode(pre[preStart]);
        tree.left = null;
        tree.right = null;
        if (preStart == preEnd && inStart == inEnd) {
            return tree;
        }
        int root = 0;
        for(root= inStart; root < inEnd; root++){
            if (pre[preStart] == in[root]) {
                break;
            }
        }
        int leifLength = root - inStart;
        int rightLength = inEnd - root;
        if (leifLength > 0) {
            tree.left = reConstructBinaryTreeCore(pre, in, preStart+1, preStart+leifLength, inStart, root-1);
        }
        if (rightLength > 0) {
            tree.right = reConstructBinaryTreeCore(pre, in, preStart+1+leifLength, preEnd, root+1, inEnd);
        }
        return tree;
    }
  • image

实验2.3

  • 实验内容
    • 完成PP16.6,提交测试代码运行截图,要全屏,包含自己的学号信息。
    • 提交测试代码运行截图,要全屏,包含自己的学号信息。
  • 实验过程
    • 修改教材十六章的代码,将自己想要的问题和答案做成二叉树,再用自己实现的基础二叉树实现出来。我的二叉树:
      image
      核心代码学习:
public void diagnose()
    {
        Scanner scan = new Scanner(System.in);
        LinkedBinaryTree<String> current = tree;
        System.out.println ("可供选择的材料如下:金,铁,铜,塑料。回答“Y”表示同意,回答“N”表示不同意。");
        System.out.println();
        while (current.size() > 1)
        {
            System.out.println (current.getRootElement());
            if (scan.nextLine().equalsIgnoreCase("N"))
                current = current.getRight();
            else
                current = current.getLeft();
        }
        System.out.println (current.getRootElement());
    }

dignose是书上backpain诊断病痛类型的方法。这种通过客户输入来确定下一步操作的方法很久没有接触过了,之后的团队项目游戏里面可能要经常用到,在这里mark一下:

(scan.nextLine().equalsIgnoreCase("N"))。

image

实验四

  • 实验内容
    • 完成PP16.8,提交测试代码运行截图,要全屏,包含自己的学号信息
  • 实验过程
    我在查阅了网上的一些资料后采取了别人实现的一种与我们在栈的后缀表达式生成中用的近似的方法:在不涉及括号的时候奇数个数据抽出来形成一个数组,偶数位符号抽出来形成一个数组,再用两个数据元素和一个符号数组组成一个子树,这样逐级上溯到根节点。值得注意的是:构建的时候从最深层的子树往上追溯,一直到根节点结束。可以发现:有叶子结点都是数据元素,父结点都是计算符。本题中用到的计算表达树是:
    image
  • 遇到的困难及解决过程
    在计算后缀表达式的时候我遇到了困难,最终我输出的后缀表达式是一个void类型的方法输出的表达式,我不太清楚怎么调用这个输出的结果,比如我们之前在栈那一章节里面用的计算方法需要读取String类型的表达式,但是我在网上也没有查到能直接将void类型转换成string类型的方法,毕竟void类型本身有时候就是无类型定义方法的通用归类。我只能采取手动输入的方式来调用后缀表达式计算方法了。
    image

实验五

  • 实验内容:完成PP17.1,提交测试代码运行截图,要全屏,包含自己的学号信息
  • 实验过程:这个查找树应该更形象地称之为老师说的排序树更合适,add方法在添加的时候是按照顺序添加的,比父节点小的元素在左子树上添加,如果已经有左子结点与左子结点比较这样循环。这样最终输出的时候finmin即输出中序表达式的第一个元素即可,findmax输出最后一个元素即可。
    image
posted @ 2017-10-27 21:56  162315  阅读(437)  评论(1编辑  收藏  举报