1. 程式人生 > 其它 >20202325 實驗八 《結構基礎與面向物件程式設計》實驗報告

20202325 實驗八 《結構基礎與面向物件程式設計》實驗報告

# 20202306 2021-2022-1 《資料結構與面向物件程式設計》實驗八報告

課程:《程式設計與資料結構》
班級: 2023
姓名: 和宇
學號:20202325
實驗教師:王志強
實驗日期:2021年11月25日
必修/選修: 必修

## 1.實驗內容

1.參考教材PP16.1,完成鏈樹LinkedBinaryTree的實現(getRight,contains,toString,preorder,postorder)

用JUnit或自己編寫驅動類對自己實現的LinkedBinaryTree進行測試,提交測試程式碼執行截圖,要全屏,包含自己的學號資訊

課下把程式碼推送到程式碼託管平臺

2.基於LinkedBinaryTree,實現基於(中序,先序)序列構造唯一一棵二㕚樹的功能,比如給出中序HDIBEMJNAFCKGL和後序ABDHIEJMNCFGKL,構造出附圖中的樹

用JUnit或自己編寫驅動類對自己實現的功能進行測試,提交測試程式碼執行截圖,要全屏,包含自己的學號資訊

課下把程式碼推送到程式碼託管平臺

3.自己設計並實現一顆決策樹

提交測試程式碼執行截圖,要全屏,包含自己的學號資訊

課下把程式碼推送到程式碼託管平臺

4.輸入中綴表示式,使用樹將中綴表示式轉換為字尾表示式,並輸出字尾表示式和計算結果(如果沒有用樹,正常評分。如果用到了樹,即使有小的問題,也酌情給滿分)

提交測試程式碼執行截圖,要全屏,包含自己的學號資訊

#過程

1.參考教材PP16.1,完成鏈樹LinkedBinaryTree的實現(getRight,contains,toString,preorder,postorder)

用JUnit或自己編寫驅動類對自己實現的LinkedBinaryTree進行測試,提交測試程式碼執行截圖,要全屏,包含自己的學號資訊

課下把程式碼推送到程式碼託管平臺

程式碼:

Node:

package BinaryTree;

public class Node {
    int data;   //節點資料
    Node leftChild; //左子節點的引用
    Node rightChild; //右子節點的引用
    boolean isDelete;//表示節點是否被刪除

    public Node(int data){
        this.data = data;
    }
    
//列印節點內容 // public void display(){ // System.out.println(data); // } @Override public String toString() { return "data=" + data +","+ "leftChild=" + leftChild + ","+" rightChild=" + rightChild + ","+"isDelete=" + isDelete; } }

BinareTree:

package BinaryTree;

public class BinaryTree1 implements Tree {
    private Node root;


    //插入節點
    public boolean insert(int data) {
        Node newNode = new Node(data);
        if(root == null){//當前樹為空樹,沒有任何節點
            root = newNode;
            return true;
        }else{
            Node current = root;
            Node parentNode = null;
            while(current != null){
                parentNode = current;
                if(current.data > data){//當前值比插入值大,搜尋左子節點
                    current = current.leftChild;
                    if(current == null){//左子節點為空,直接將新值插入到該節點
                        parentNode.leftChild = newNode;
                        return true;
                    }
                }else{
                    current = current.rightChild;
                    if(current == null){//右子節點為空,直接將新值插入到該節點
                        parentNode.rightChild = newNode;
                        return true;
                    }
                }
            }
        }
        return false;
    }

    //查詢節點
    public Node find(int key) {
        Node current = root;
        while(current != null){
            if(current.data > key){//當前值比查詢值大,搜尋左子樹
                current = current.leftChild;
            }else if(current.data < key){//當前值比查詢值小,搜尋右子樹
                current = current.rightChild;
            }else{
                return current;
            }
        }
        return null;//遍歷完整個樹沒找到,返回null
    }

    //中序遍歷
    public void infixOrder(Node current){
        if(current != null){
            infixOrder(current.leftChild);
            System.out.print(current.data+" ");
            infixOrder(current.rightChild);
        }
    }

    //前序遍歷
    public void preOrder(Node current){
        if(current != null){
            System.out.print(current.data+" ");
            preOrder(current.leftChild);
            preOrder(current.rightChild);
        }
    }

    //後序遍歷
    public void postOrder(Node current){
        if(current != null){
            postOrder(current.leftChild);
            postOrder(current.rightChild);
            System.out.print(current.data+" ");
        }
    }
    //找到最大值
    public Node findMax(){
        Node current = root;
        Node maxNode = current;
        while(current != null){
            maxNode = current;
            current = current.rightChild;
        }
        return maxNode;
    }
    //找到最小值
    public Node findMin(){
        Node current = root;
        Node minNode = current;
        while(current != null){
            minNode = current;
            current = current.leftChild;
        }
        return minNode;
    }

    public static void main(String[] args) {
        BinaryTree1 tree = new BinaryTree1();
        tree.insert(21);
        tree.insert(50);
        tree.insert(20);
        tree.insert(11);
        tree.insert(27);
        tree.insert(23);
        tree.insert(25);
        tree.insert(100);
        System.out.println(tree.findMax().data);
        System.out.println(tree.findMin().data);
        System.out.println(tree.find(100));
        System.out.println(tree.find(10));
        System.out.println("中序:");
        tree.infixOrder(tree.root);//中序
        System.out.println();
        System.out.println("後序:");
        tree.postOrder(tree.root);//後序
        System.out.println();
        System.out.println("先序:");
        tree.preOrder(tree.root);//前序
    }
}

執行結果:

2.基於LinkedBinaryTree,實現基於(中序,先序)序列構造唯一一棵二㕚樹的功能,比如給出中序HDIBEMJNAFCKGL和後序ABDHIEJMNCFGKL,構造出附圖中的樹

用JUnit或自己編寫驅動類對自己實現的功能進行測試,提交測試程式碼執行截圖,要全屏,包含自己的學號資訊

課下把程式碼推送到程式碼託管平臺

結果:

3.自己設計並實現一顆決策樹

提交測試程式碼執行截圖,要全屏,包含自己的學號資訊

課下把程式碼推送到程式碼託管平臺

4.輸入中綴表示式,使用樹將中綴表示式轉換為字尾表示式,並輸出字尾表示式和計算結果(如果沒有用樹,正常評分。如果用到了樹,即使有小的問題,也酌情給滿分)

提交測試程式碼執行截圖,要全屏,包含自己的學號資訊

#問題

1.程式設計沒有思路,不知道該怎麼入手。

解:翻教材,問同學,上網查資料;

2.程式與程式之間互相聯絡,互相繼承和引用,改了一個程式,結果前面的許多貌似不相關的程式直接報錯,回過頭來找卻發現已經找不到是哪裡出問題了,東拼西湊處處報錯。

#感悟

感悟還是老生常談,編寫程式時迷迷糊糊的,感覺腦子已經不夠用了……得潛心學習一段時間了。

## 參考資料

- [《Java和Andriod開發學習指南(第二版)人民郵電出版社》]

- [《Java軟體結構與資料結構(第三版)清華大學出版社》]