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

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

课程:《程序设计与数据结构》
班级: 1823
姓名: 盛国榕
学号:20182332
实验教师:王志强
实验日期:2019年10月28日
必修/选修: 必修

1.实验内容

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

    2.实验过程及结果:

  • 链树的实现:
    20182332 《数据结构与面向对象程序设计》实验八报告_第1张图片

getRight
   public LinkedBinaryTree getRight()
    {
        LinkedBinaryTree node = new LinkedBinaryTree();
        node.root=root.getRight();
       // return new LinkedBinaryTree(root.getRight());
       return node;
    }
    
contains
   public boolean contains(T targetElement)
    {
        if (find(targetElement)==targetElement){
        return true;
    }
    else {
            return false;
        }

    }
    public T find(T targetElement) throws ElementNotFoundException
    {
        BinaryTreeNode current = findNode(targetElement, root);

        if (current == null)
            throw new ElementNotFoundException("LinkedBinaryTree");

        return (current.getElement());
    }
    private BinaryTreeNode findNode(T targetElement,
                                        BinaryTreeNode next)
    {
        if (next == null)
            return null;

        if (next.getElement().equals(targetElement))
            return next;

        BinaryTreeNode temp = findNode(targetElement, next.getLeft());

        if (temp == null)
            temp = findNode(targetElement, next.getRight());

        return temp;
    }   
    
    
toString
public String toString()
    {
        UnorderedListADT nodes =
                new ArrayUnorderedList();
        UnorderedListADT levelList =
                new ArrayUnorderedList();
        BinaryTreeNode current;
        String result = "";
        int printDepth = this.getHeight();
        int possibleNodes = (int)Math.pow(2, printDepth + 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 + "\n\n";
                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;
    }


preorder
public Iterator iteratorPreOrder()
    {
        ArrayUnorderedList tempList = new ArrayUnorderedList();
       preOrder(root, tempList);

        return new TreeIterator(tempList.iterator());
    }
    
protected void preOrder(BinaryTreeNode node,
                            ArrayUnorderedList tempList)
    {
        if(node!=null)
            {
               System.out.print(node.getElement()+" ");
                tempList.addToRear(node.getElement());
                preOrder(node.getLeft(),tempList);
                preOrder(node.getRight(),tempList);
            }

    }
  • 基于中序、先序序列构造树:
    • 二叉树前序遍历:先根节点,后左子树,再右子树。
    • 二叉树中序遍历:先左子树,后根节点,再右子树。
    • 二叉树中序遍历:先左子树,后右子树,再根节点。

20182332 《数据结构与面向对象程序设计》实验八报告_第2张图片

  • 设计一棵决策树:

20182332 《数据结构与面向对象程序设计》实验八报告_第3张图片

  • 中缀转后缀并计算:

20182332 《数据结构与面向对象程序设计》实验八报告_第4张图片

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

  • 空指针异常

20182332 《数据结构与面向对象程序设计》实验八报告_第5张图片

  • 解决方案:检查数据的传递,进行单步调试后发现是import了一个和实验无关的包,删除该import即可。

感想

实验有点难,借鉴了书上和网上的一部分代码。。。还需努力

参考文献

  • Java实现二叉树的前序、中序、后序、层序遍历(非递归方法)
  • 《Java程序设计与数据结构教程(第二版)》
  • 《Java程序设计与数据结构教程(第二版)》学习指导
  • java实现二叉树已知先序遍历和中序遍历求后序遍历



你可能感兴趣的:(20182332 《数据结构与面向对象程序设计》实验八报告)