zoukankan      html  css  js  c++  java
  • # 20182304 实验八 《数据结构与面向对象程序设计》实验报告

    20182304 实验八 《数据结构与面向对象程序设计》实验报告

    课程:《程序设计与数据结构》
    班级: 1823
    姓名: 张子正
    学号:20182304
    实验教师:王志强
    实验日期:2019年11月11日
    必修/选修: 必修

    1.实验内容

    • 参考教材PP16.1,完成链树LinkedBinaryTree的实现(getRight,contains,toString,preorder,postorder)
      用JUnit或自己编写驱动类对自己实现的LinkedBinaryTree进行测试,提交测试代码运行截图,要全屏,包含自己的学号信息
      课下把代码推送到代码托管平台
    • 基于LinkedBinaryTree,实现基于(中序,先序)序列构造唯一一棵二㕚树的功能,比如给出中序HDIBEMJNAFCKGL和后序ABDHIEJMNCFGKL,构造出附图中的树
      用JUnit或自己编写驱动类对自己实现的功能进行测试,提交测试代码运行截图,要全屏,包含自己的学号信息
      课下把代码推送到代码托管平台
    • 自己设计并实现一颗决策树
      提交测试代码运行截图,要全屏,包含自己的学号信息
      课下把代码推送到代码托管平台
    • 输入中缀表达式,使用树将中缀表达式转换为后缀表达式,并输出后缀表达式和计算结果(如果没有用树,正常评分。如果用到了树,即使有小的问题,也酌情给满分)
      提交测试代码运行截图,要全屏,包含自己的学号信息

    2. 实验过程及结果

    • 1.本来以为简单按照书上代码补全方法就可以了,但是书上代码有很多遗漏的地方,很多类完全没有实现,要求我们自己编写。一些类,比如tostring十分复杂,编程时造成了很大困扰。
      - ArrayIterator没有接触,便换成了ArrayList替代


    • 2.在实验一的基础上,加入能够从上到下构造二叉树的方法即可解决

    • 3.决策树的实现是不难的,上交书上例题后,将相应字符串做一个简单的修改就可以了

    • 4.如果不使用树来做,那么思路是不难的。我也尝试在网上寻找使用树解决的方法,却与我自己的代码结合不起来,频频报错,最终只能放弃

    3. 实验过程中遇到的问题和解决过程

    • 问题1:按照书上的方法补全树,输出树子节点出现了问题
    • 问题1解决方案:不能简单地自动生成toString方法,toString方法要考虑多种情况,实现很复杂
      • 原来:
    @Override
        public String toString() {
            return "LinkedBinaryTree{" +
                    "root=" + root +
                    '}';
        }
    
      - 修改后:
    
    public String toString2() {
           UnorderedListADT<BinaryTreeNode<T>> nodes =
                   new ArrayUnorderedList<BinaryTreeNode<T>>();
           UnorderedListADT<Integer> levelList =
                   new ArrayUnorderedList<Integer>();
           BinaryTreeNode<T> current;
           String result = "";
           int printDepth = this.getHeight();
           int possibleNodes = (int) Math.pow(2, printDepth + 1); // 最多的结点数 + 1
           int countNodes = 0;
    
           nodes.addToRear(root);
           Integer currentLevel = 0;
           Integer previousLevel = -1;
           levelList.addToRear(currentLevel);
    
           while (countNodes < possibleNodes) {
               countNodes = countNodes + 1;
               current = nodes.removeFirst();
               currentLevel = levelList.removeFirst();
               if (currentLevel > previousLevel) {
                   result = result + "
    
    ";
                   previousLevel = currentLevel;
                   for (int j = 0; j < ((Math.pow(2, (printDepth - currentLevel))) - 1); j++)
                       result = result + " ";
               } else {
                   for (int i = 0; i < ((Math.pow(2, (printDepth - currentLevel + 1)) - 1)); i++) {
                       result = result + " ";
                   }
               }
               if (current != null) {
                   result = result + (current.getElement()).toString();
                   nodes.addToRear(current.getLeft());
                   levelList.addToRear(currentLevel + 1);
                   nodes.addToRear(current.getRight());
                   levelList.addToRear(currentLevel + 1);
               } else {
                   nodes.addToRear(null);
                   levelList.addToRear(currentLevel + 1);
                   nodes.addToRear(null);
                   levelList.addToRear(currentLevel + 1);
                   result = result + " ";
               }
    
           }
    
           return result;
       }
    
    • 最后对书上的代码进行了大改,程序才能正常运行。这让我意识到教材中也存在着问题。这是类和代码已经空前复杂,明显可以看出实践难度大大增强了,需要求助同学和网络才能解决问题。

    • 问题2:给出遍历后序中序,如何确定一棵树?

    • 问题2解决方案:首先找到根节点,通过后序遍历的最后一个数,由这个数将中序遍历分割开来,不断重复找当前这棵树的根节点,递归实现

    • 问题3:实验中的Iterator是什么意思?

    • 问题三解决方案:通过网络查询

    • 迭代器简介(Iterator)

    • 迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。迭代器通常被称为“轻量级”对象,因为创建它的代价小。Java中的Iterator功能比较简单,并且只能单向移动:
        - 使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。注意:iterator()方法是java.lang.Iterable接口,被Collection继承。
        - 使用next()获得序列中的下一个元素。
        - 使用hasNext()检查序列中是否还有元素。
        - 使用remove()将迭代器新返回的元素删除。
        - Iterator是Java迭代器最简单的实现,为List设计的ListIterator具有更多的功能,它可以从两个方向遍历List,也可以从List中插入和删除元素。

    其他(感悟、思考等)

    • 二叉树的实现对我们的编程能力提出了极大的考验,如果我们单凭自己解决不了问题,就需要学着理解网络上的代码,并试着将它修改成合适的形式,使其能够在我们电脑上运行

    参考资料

  • 相关阅读:
    ByteBuffer用法总结
    内部类访问外部同名属性或者方法
    floodlight 学习(一)
    ubuntu 更改文件所有者
    python cmd 模块
    matlab 矩阵
    python操作MySQL数据库
    Win 7 下制作 mac 系统启动U盘
    Window 常用命令
    大数据扫盲
  • 原文地址:https://www.cnblogs.com/acgacg/p/11879135.html
Copyright © 2011-2022 走看看