20172319 实验二《树》实验报告

Posted tangcaiming

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了20172319 实验二《树》实验报告相关的知识,希望对你有一定的参考价值。

20172319 2018.11.04-11.12

实验二《树》 实验报告

课程名称:《程序设计与数据结构》  
学生班级:1723班  
学生姓名:唐才铭  
学生学号:20172319 
实验教师:王志强老师
课程助教:张师瑜学姐、张之睿学长
实验时间:2018年11月04日——2018年11月12日
必修/选修:必修

目录


实验内容

  1. 实验二-1-实现二叉树: 完成链树LinkedBinaryTree的实现。
  2. 实验二 树-2-中序先序序列构造二叉树: 基于LinkedBinaryTree,实现基于(中序,先序)序列构造唯一一棵二?树的功能
  3. 实验二 树-3-决策树: 自己设计并实现一颗决策树
  4. 实验二 树-4-表达式树: 输入中缀表达式,使用树将中缀表达式转换为后缀表达式,并输出后缀表达式和计算结果
  5. 实验二 树-5-二叉查找树: 完成PP11.3
  6. 实验二 树-6-红黑树分析: 参考http://www.cnblogs.com/rocedu/p/7483915.html对Java中的红黑树(TreeMap,HashMap)进行源码分析,并在实验报告中体现分析结果

返回目录


实验要求

  1. 完成蓝墨云上与实验二《树》相关的活动,及时提交代码运行截图和码云Git链接,截图要有学号水印,否则会扣分。
  2. 完成实验、撰写实验报告,实验报告以博客方式发表在博客园,注意实验报告重点是运行结果,遇到的问题(工具查找,安装,使用,程序的编辑,调试,运行等)、解决办法(空洞的方法如“查网络”、“问同学”、“看书”等一律得0分)以及分析(从中可以得到什么启示,有什么收获,教训等)。报告可以参考范飞龙老师的指导
  3. 严禁抄袭,有该行为者实验成绩归零,并附加其他惩罚措施。

返回目录


实验步骤

  1. 实验二-1-实现二叉树:
    参考教材p212,完成链树LinkedBinaryTree的实现(getRight,contains,toString,preorder,postorder)
    用JUnit或自己编写驱动类对自己实现的LinkedBinaryTree进行测试,提交测试代码运行截图,要全屏,包含自己的学号信息
    课下把代码推送到代码托管平台
  2. 实验二 树-2-中序先序序列构造二叉树:
    基于LinkedBinaryTree,实现基于(中序,先序)序列构造唯一一棵二?树的功能,比如给出中序HDIBEMJNAFCKGL和后序ABDHIEJMNCFGKL,构造出附图中的树
    用JUnit或自己编写驱动类对自己实现的功能进行测试,提交测试代码运行截图,要全屏,包含自己的学号信息
    课下把代码推送到代码托管平台
    技术分享图片
  3. 实验二 树-3-决策树:
    自己设计并实现一颗决策树
    提交测试代码运行截图,要全屏,包含自己的学号信息
    课下把代码推送到代码托管平台
  4. 实验二 树-4-表达式树:
    输入中缀表达式,使用树将中缀表达式转换为后缀表达式,并输出后缀表达式和计算结果(如果没有用树,则为0分)
    提交测试代码运行截图,要全屏,包含自己的学号信息
    课下把代码推送到代码托管平台
  5. 实验二 树-5-二叉查找树:
    完成PP11.3
    提交测试代码运行截图,要全屏,包含自己的学号信息
    课下把代码推送到代码托管平台
  6. 实验二 树-5-二叉查找树:
    参考http://www.cnblogs.com/rocedu/p/7483915.html对Java中的红黑树(TreeMap,HashMap)进行源码分析,并在实验报告中体现分析结果。
    (C:Program FilesJavajdk-11.0.1libsrcjava.basejavautil)

前期准备:

  1. 预先下载安装好IDEA 。

需求分析:

  1. 需要掌握二叉查找树的相关知识;
  2. 需要掌握当任意给出两个序能构建出唯一一棵二叉树;
  3. 需要理解表达式树的实现;
  4. 需要理解决策树的实现。

返回目录


代码实现及解释

本次实验一共分为六个提交点:

  • 实验二-1-实现二叉树:
  • 根据自己的需求,写好自己所需要的链表节点类链表类
  • 在链表类里写了add方法用于往链表添加元素
 public void add(int number){
        Linked_list_node Node = new Linked_list_node(number);

        if (this.head==null){
            this.head = Node;
        }
        else {
            this.head.addLinked_list_node(Node);
        }
    }
  • 具体的代码实现:
        System.out.println("实验的第一部分:");
        System.out.print("Enter some integers and create a linked list :   ");
        Scanner scanner = new Scanner(System.in);
        String input = scanner.nextLine();
        String[] strings = input.split(" ");

        Stack<String> Break_up = new Stack<String>();
        for (int i = strings.length; i > 0 ; i--){
            Break_up.push(strings[i-1]);
        }
        System.out.print("The contents of the stack are :   ");
        System.out.println(Break_up);
        Linked_list linked_list = new Linked_list();
        linked_list.add(0);
        while (!Break_up.empty()) {
            int tempelement = Integer.parseInt(Break_up.pop());
            linked_list.add(tempelement);
        }
        int ntangcaiming = 0;
        ntangcaiming = linked_list.getCount();
        System.out.print("The contents of the queue are :   ");
        System.out.println(linked_list);
        System.out.print("The number of linked elements is :   ");
        System.out.println(ntangcaiming);
  • 运行结果截图:
    技术分享图片

  • 线性结构之链表(2)
  • 根据需要,我们需要写插入和删除的方法:
  • 为了更好地实现需求,我们在链表前端放入了一个取值为0的节点linked_list.add(0);,以便于在任何地方都能实现插入删除,而打印时将其隐藏。

public void insert(int index,Linked_list_node node){
        if(index < 1||index > getCount() + 1){
            System.out.println("Wrong position, cannot insert");
            return;
        }
        int length = 1;
        Linked_list_node temp = head;
        while(head.next != null)
        {
            if(index == length++){
                node.next = temp.next;
                temp.next = node;
                return;
            }
            temp = temp.next;
        }
    }

    public void delete(int index){
        if(index < 1 || index > getCount()){
            System.out.println("Wrong position, cannot be deleted");
            return;
        }
        int length=1;
        Linked_list_node temp = head;
        while(temp.next != null){
            if(index == length++){
                temp.next = temp.next.next;
                return;
            }
            temp = temp.next;
        }
    }
  • 根据以前所写IO进行文件的创建及读取;
  • 本次提交点相关代码如下:
        System.out.println("实验的第二部分:");
        try {
            File file = new File("D:\\huawei\\Javawindows文件","EXP1-First semester of sophomore.txt");

            InputStreamReader reader = new InputStreamReader(new FileInputStream(file));
            BufferedReader bufferedReader = new BufferedReader(reader);
            int[] file_word_temp = new int[2];
            String[] file_word = bufferedReader.readLine().split(" ");
            file_word_temp[0] = Integer.parseInt(file_word[0]);
            file_word_temp[1] = Integer.parseInt(file_word[1]);

            Linked_list_node Node_insert1 = new Linked_list_node(file_word_temp[0]);
            Linked_list_node Node_insert2 = new Linked_list_node(file_word_temp[1]);

            linked_list.insert(5,Node_insert1);
            System.out.print("The list after inserting 1 at the fifth position is :   ");
            System.out.println(linked_list);
            System.out.print("The number of linked elements is :   ");
            ntangcaiming = linked_list.getCount();
            System.out.println(ntangcaiming);
            linked_list.insert(1,Node_insert2);
            System.out.print("The list after inserting 2 at the first position is :   ");
            System.out.println(linked_list);
            ntangcaiming = linked_list.getCount();
            System.out.print("The number of linked elements is :   ");
            System.out.println(ntangcaiming);
            System.out.print("The list after deleting the inserted number 1 is :   ");
            linked_list.delete(6);
            System.out.println(linked_list);
            ntangcaiming = linked_list.getCount();
            System.out.print("The number of linked elements is :   ");
            System.out.println(ntangcaiming);
  • 运行结果截图:
    技术分享图片

  • 线性结构之链表(2)

  • 根据要求,我们所选择的是冒泡排序法,依据要求打印排序过程(这里只打印元素交换的时候):
  • 冒泡代码实现如下(有删减):

public void Bubble_sort(Linked_list_node Head,Linked_list linked_list){


        Linked_list_node temp = null, tail = null;
        
        temp = head;

        int count=1;
        while(temp.next != tail){
            while(temp.next != tail){
                if(temp.number > temp.next.number){
                    int temp_number = temp.number;
                    temp.number = temp.next.number;
                    temp.next.number = temp_number;
                    System.out.print("The list sorted by the "+ count + " truly bubbling sort is :  ");
                    System.out.println(linked_list);
                    System.out.print("The number of linked elements is :  " + linked_list.getCount() + "
" );

                    count++;
                }
                temp = temp.next;

            }
            tail = temp;
            temp = head;
        }
    }
  • 相关提交点的代码:
            System.out.println("实验的第三部分:");
            System.out.println("Print only the rounds that have implemented the element exchange:");

            linked_list.Bubble_sort(linked_list.head,linked_list);
    }
        catch (IOException E){
        System.out.println("错误,指定路径不存在");
    }
  • 运行结果截图(仅仅展示部分截图):
    技术分享图片

  • 线性结构之数组(4)
  • 根据需要编写自己的数组类
  • 本次提交点相关代码如下:

 System.out.println("实验的第一部分:");
        System.out.print("Enter some integers and create a linked list:");
        Scanner scanner = new Scanner(System.in);
        String input = scanner.nextLine();

        int ntangcaiming = 0 ;
        String[] temp_MyArray = input.split(" ");
        Array MyArray = new Array(temp_MyArray);

        System.out.print("The elements in the array are:   ");
        System.out.println(MyArray);
        System.out.print("The number of elements in the array is:  ");
        ntangcaiming = MyArray.size();
        System.out.println(ntangcaiming);

        System.out.println("实验的第二部分:");
        try {
            File file = new File("D:\\huawei\\Javawindows文件","EXP1-First semester of sophomore.txt");
            InputStreamReader reader = new InputStreamReader(new FileInputStream(file));
            BufferedReader bufferedReader = new BufferedReader(reader);
            int[] file_word_temp = new int[2];
            String[] file_word = bufferedReader.readLine().split(" ");
            file_word_temp[0] = Integer.parseInt(file_word[0]);
            file_word_temp[1] = Integer.parseInt(file_word[1]);


            System.out.print("The array after 1 is inserted in position 5 is :   ");
            Array MyArray1 = new Array(MyArray.Array_Insert(4, String.valueOf(file_word_temp[0]))) ;
            System.out.println(MyArray1);
            System.out.print("The number of elements in the array is:  ");
            ntangcaiming = MyArray1.size();
            System.out.println(ntangcaiming);


            System.out.print("The list after inserting 2 at the first position is :   ");

            Array MyArray2 = new Array(MyArray1.Array_Insert(0, String.valueOf(file_word_temp[1])));
            System.out.println(MyArray2);
            System.out.print("The number of elements in the array is:  ");
            ntangcaiming = MyArray2.size();
            System.out.println(ntangcaiming);

            System.out.print("The array after deleting the inserted number 1 is :   ");

            Array MyArray3 = new Array(MyArray2.Array_Delete(5));
            System.out.println(MyArray3);
            System.out.print("The number of elements in the array is:  ");
            ntangcaiming = MyArray3.size();
            System.out.println(ntangcaiming);
  • 运行结果截图:

技术分享图片

  • 线性结构之数组(5)
  • 按照要求,我选择的是选择排序法:
  • 相关代码如下:
 public String Array_Selection_sort() {
        int[] temp_MyArray = new int[MyArray.length];
        for (int i = 0 ; i < MyArray.length; i ++){
            temp_MyArray[i] = Integer.parseInt(MyArray[i]);
        }

        String result = "";
        for (int i = 0; i < temp_MyArray.length - 1 ; i++){
            for (int j = i + 1;j < temp_MyArray.length; j++ ){
                if (temp_MyArray[i]<temp_MyArray[j]){
                    int temp = temp_MyArray[i];
                    temp_MyArray[i] = temp_MyArray[j];
                    temp_MyArray[j] = temp;
                    String every = "";
                    for (int data : temp_MyArray){
                        every += data + " ";
                    }
                    result += "The list sorted by the SelectSorting is :  " + every + "
" +
                            "The number of elements in the array is:  :" + MyArray.length + "
";
                }
            }
        }
        return result;
    }
  • 本次提交点的相关代码(有删减):
            System.out.println("实验的第三部分:");
            System.out.print(MyArray3.Array_Selection_sort());
  • 运行结果截图(仅部分)
    技术分享图片

返回目录


测试过程及遇到的问题

  • 问题1:
  • 解决:

返回目录


分析总结

  • 这是一个全新的内容,与我们原来所学的相关,且更深一层并更接近了我们的生活,虽然项目的开发过程的某些代码的含义还不能完全明白,但在以后的过程中会逐一认识、了解并掌握。

返回目录


代码托管

技术分享图片

返回目录


参考资料

Intellj IDEA 简易教程
Android开发简易教程
Android studio项目上传至oschina(码云)教程

返回目录



























以上是关于20172319 实验二《树》实验报告的主要内容,如果未能解决你的问题,请参考以下文章

哈夫曼编码

20172302 《Java软件结构与数据结构》实验二:树实验报告

数据机构实验报告-实验三 二叉树基本操作的实现

20172303 2018-2019-1 《程序设计与数据结构》实验二报告

20172314 《程序设计与数据结构》实验报告——树

20172301 哈夫曼树实验报告