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

20202303 實驗八《資料結構與面向物件程式設計》實驗報告

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

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

## 1.實驗內容

  • 參考教材PP16.1,完成鏈樹LinkedBinaryTree的實現(getRight,contains,toString,preorder,postorder)
    用JUnit或自己編寫驅動類對自己實現的LinkedBinaryTree進行測試,提交測試程式碼執行截圖,要全屏,包含自己的學號資訊
    課下把程式碼推送到程式碼託管平臺
  • 基於LinkedBinaryTree,實現基於(中序,先序)序列構造唯一一棵二㕚樹的功能,比如給出中序HDIBEMJNAFCKGL和後序ABDHIEJMNCFGKL,構造出附圖中的樹
    用JUnit或自己編寫驅動類對自己實現的功能進行測試,提交測試程式碼執行截圖,要全屏,包含自己的學號資訊
    課下把程式碼推送到程式碼託管平臺
  • 自己設計並實現一顆決策樹
    提交測試程式碼執行截圖,要全屏,包含自己的學號資訊
    課下把程式碼推送到程式碼託管平臺
  • 輸入中綴表示式,使用樹將中綴表示式轉換為字尾表示式,並輸出字尾表示式和計算結果(如果沒有用樹,正常評分。如果用到了樹,即使有小的問題,也酌情給滿分)
    提交測試程式碼執行截圖,要全屏,包含自己的學號資訊

## 2. 實驗過程及結果
(1)參考教材PP16.1,完成鏈樹LinkedBinaryTree的實現(getRight,contains,toString,preorder,postorder)

  • 用JUnit或自己編寫驅動類對自己實現的LinkedBinaryTree進行測試,提交測試程式碼執行截圖,要全屏,包含自己的學號資訊
  • 課下把程式碼推送到程式碼託管平臺

根據類中已經存在的方法補全剩餘的方法,如getRight可以參考getLeft,preorder,postorder可以參考inorder。而剩下的contains,isEmpty則可以通過呼叫BTNode中的方法來完成。

接下來是測試程式碼的通過(學號測試):

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

  • 用JUnit或自己編寫驅動類對自己實現的功能進行測試,提交測試程式碼執行截圖,要全屏,包含自己的學號信
  • 課下把程式碼推送到程式碼託管平臺

程式的基本原理是已知先序和中序、中序和後序可以確立一棵唯一二叉樹。而已知先序和後序是不能確定的,因為左右子樹可能不同。構建的基本思想:先序序列的第一個結點肯定是根節點,所以先在中序序列中找到相同的根節點,以它為劃分左右分別為左右子樹。再進行相似的步驟,先序序列的第二個元素就是左子樹的第一個節點,再在中序序列中以它為中心劃分左右子樹,以此類推。構建完左邊的整個子樹後,以相同的原理構建右子樹。

  • 程式碼示例:
public BTNode construct(char[] pre, char[] in){
      if (pre.length == 0 || in.length == 0) {
         return null;
      }
      BTNode<Character> tree = new BTNode<Character>(pre[0]);
      int index = search(0, in.length, in, tree.getElement());
      tree.setLeft(construct(Arrays.copyOfRange(pre, 1, index + 1), Arrays.copyOfRange(in, 0, index)));
      tree.setRight(construct(Arrays.copyOfRange(pre, index + 1, pre.length),
              Arrays.copyOfRange(in, index + 1, in.length)));
      return tree;
   }
   
public int search(int start, int end, char[] inOrders, char data) {
      for (int i = start; i < end; i++) {
         if (data == inOrders[i]) {
            return i;
         }
      }
      return -1;
   }

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

  • 提交測試程式碼執行截圖,要全屏,包含自己的學號資訊
  • 課下把程式碼推送到程式碼託管平臺

測試程式碼:

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

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

先通過中綴表示式構建出一棵樹,然後以後序遍歷這棵樹,得到的就是字尾表示式

## 3. 實驗過程中遇到的問題和解決過程
- 問題1:在程式編寫中,IDEA證書過期了,真的無語。。。。。
- 問題1解決方案:利用現代網路的發達技術,終於換成了無限迴圈式使用,怒贊網路這個寬闊的平臺。
- 問題2:在編寫過程中,教材程式碼中的ArrayIterator類無法識別

- 問題2解決方案:通過網路搜尋以及搜尋,發現把這個方法的定義型別為ArrayList就可以啦。
- 問題3:在測試過程中,發現最開始的編寫與自己預期的出現順序不一致,過不了。

- 問題3解決方案:在物件呼叫完方法後,再呼叫toString()方法,將兩者結合起來,比如文上的e.inorder().toString()


## 其他

感悟:樹的結構其實大部分在離散裡也接觸過,雖然但是,我萬萬沒想到要把這個東西做成程式,雖然有課本,但耐不住本人腦子有限,在實踐方面還差缺火候,尤其是在許多方法補充的方面,特別吃力,而且寫出來也其實沒咋記住和理解,尤其是遞迴演算法,要了老命了,還是希望下次難度低一點,我會之後努力實踐,然後繼續加油!


## 參考資料

- 《Java程式設計教程(第九版)》

- 《Java軟體結構與資料結構(第四版)》


- 網頁搜尋資料:https://blog.csdn.net/qq_26219679/article/details/79647221

- 網頁搜尋資料:https://blog.csdn.net/weixin_30384217/article/details/99115000

- 雲班課:https://www.cnblogs.com/rocedu/p/6371262.html