1. 程式人生 > >20172319 實驗二《樹》實驗報告

20172319 實驗二《樹》實驗報告

表達 提交代碼 添加 需求 後序 打印 nod 全屏 數據結構

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 Files\Java\jdk-11.0.1\lib\src\java.base\java\util)

前期準備:

  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() + "\n" );

                    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 + "\n" +
                            "The number of elements in the array is:  :" + MyArray.length + "\n";
                }
            }
        }
        return result;
    }
  • 本次提交點的相關代碼(有刪減):
            System.out.println("實驗的第三部分:");
            System.out.print(MyArray3.Array_Selection_sort());
  • 運行結果截圖(僅部分)
    技術分享圖片

返回目錄


測試過程及遇到的問題

  • 問題1:
  • 解決:

返回目錄


分析總結

  • 這是一個全新的內容,與我們原來所學的相關,且更深一層並更接近了我們的生活,雖然項目的開發過程的某些代碼的含義還不能完全明白,但在以後的過程中會逐一認識、了解並掌握。

返回目錄


代碼托管

技術分享圖片

返回目錄


參考資料

Intellj IDEA 簡易教程
Android開發簡易教程
Android studio項目上傳至oschina(碼雲)教程

返回目錄

20172319 實驗二《樹》實驗報告