20182311 2019-2020-1 《数据结构与面向对象程序设计》实验八报告

20182311 2019-2020-1 《数据结构与面向对象程序设计》实验八报告

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

1.实验内容

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

2. 实验过程及结果

  • 链树的实现:

  • 基于中序、先序序列构造树:
    构造思路:明确不同遍历的特征,确定边界
    二叉树前序遍历:先根节点,后左子树,再右子树
    二叉树中序遍历:先左子树,后根节点,再右子树

  • 先序表达式的第一位是根节点,在中序表达式中找到根节点,表达式左边即为左子树,右边即为右子树。把表达式左边当成一个新的中序表达式,重复上述操作,可根据递归思想构造完成。

  • 设计决策树:基于链树实现,将决策信息填入结点中,定义一个访问方法,设置判定条件为输入n即访问左子树,输入y即访问右子树。

  • 中缀转后缀并计算:当遇到数字时,直接存入后缀表达式;当遇到符号时,若栈顶元素优先级高于等于这个符号,栈顶元素出栈存入表达式,符号入栈,若栈顶元素优先级低于它直接入栈。当遇到(时直接存入,遇到)匹配上一个(,()中间所有元素全部出栈。

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

  • 问题1:目前使用过的造树方法或者小技巧:
  1. 递归造树时,使用数组自增a[i++]。
  2. 非递归造树时,根据需求定义多个add方法,填充空树。
  3. 树的实现具体靠链式结构还是数组结构视情况而定。有些时候通过数组下标访问会更快。比如数组下标为n的左右子树下标分别为2n及2n+1.
  4. 有些树需要借助其他数据类型构造。比如根据前序、中序、后序表达式构造一棵树,需要用到栈。
  5. 大多数情况下还是用递归造树,造了这么多树,虚空结点的树我觉得比较典型,造树代码如下:
    public Tree(String str) {
        StringTokenizer stringTokenizer = new StringTokenizer(str);
        String[] a=new String[20];
        int j=0;
        while (stringTokenizer.hasMoreTokens()) {
            a[j++]= stringTokenizer.nextToken();
        }
        //一定要把root换成create后的root
        root=CreateTree(root,a);
    }
//建立虚空结点的树
    public Node CreateTree(Node x,String[] data) {
        String temp=data[i++];
        if (temp.equals("#"))
            return null;
        else{
            x=new Node(temp);
            x.setLeft(CreateTree(x.getLeft(),data));
            x.setRight(CreateTree(x.getRight(),data));
        }
        return x;
    }
  • 问题2:目前的遍历方法总结:
  • 前序、中序、后序的递归实现与非递归实现、层级遍历:具体代码和思路参考

猜你喜欢

转载自www.cnblogs.com/lengchong/p/11872148.html