111 年 國立中山大學電機工程學系碩士班丙組《資料結構》

📄 試題原卷 免費註冊後即可對照原始考卷 PDF免費註冊

第 1 題30 分

【每一小題10分,共30分】依序輸入正整數60、35、11、45、8、72、6。
① 請依據上述輸入次序,建造一棵 binary search tree。
② 請依據上述輸入次序,建造一棵 min-heap tree。
③ 請依據上述輸入次序,建造一棵 AVL tree。

【註】:在每個小題裡,都必須畫出在每增加一個整數之後的樹狀結構,不可直接畫出最後答案;直接畫出最後答案,該小題以0分計算。

🖼️ 本題含圖表,以下為原卷對應頁面:
原卷第 2 頁

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

  • 二元搜尋樹(BST):每個節點的左子樹鍵值小於該節點,右子樹鍵值大於該節點。新值從根節點開始比較,直到找到空位置插入。
  • 最小堆積(min-heap):必須是完全二元樹,且每個父節點的值都小於或等於子節點。新值先放在下一個可用位置,再沿父節點方向向上調整。
  • AVL 樹:每個節點左右子樹高度差的絕對值不得大於 11。若插入後失衡,依失衡型態進行旋轉。

解題方法

依序插入 60、35、11、45、8、72、660、35、11、45、8、72、6。以下每個步驟都畫出新增一個整數後的樹。

① 二元搜尋樹

依大小比較決定插入位置,不進行旋轉。

插入 6060

60

插入 3535

  60
 /
35

插入 1111

    60
   /
  35
 /
11

插入 4545

    60
   /
  35
 /  \
11  45

插入 88

      60
     /
    35
   /  \
  11  45
 /
8

插入 7272

      60
     /  \
    35  72
   /  \
  11  45
 /
8

插入 66

        60
       /  \
      35  72
     /  \
    11  45
   /
  8
 /
6

② 最小堆積

新值先放在完全二元樹的下一個空位,再與父節點比較;若新值較小,就交換並繼續向上調整。

插入 6060

60

插入 3535:35<6035<60,與父節點交換。

  35
 /
60

插入 1111:11<3511<35,與父節點交換。

   11
  /  \
60   35

插入 4545:45<6045<60,與父節點交換。

    11
   /  \
  45  35
 /
60

插入 88:依序與 45、1145、11 交換。

     8
   /   \
 11    35
 / \
60 45
🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 2 題30 分

【每一小題15分,共30分】承上題,
① 在建造完畢的 min-heap tree 裡頭刪除「6」之後的 min-heap tree 為何?請畫出來。
② 在建造完畢的 AVL tree 裡頭刪除「35」之後的 AVL tree 為何?請畫出來。

🖼️ 本題含圖表,以下為原卷對應頁面:
原卷第 2 頁

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

Min-heap 必須符合兩個條件:完全二元樹的形狀,以及每個父節點的鍵值都小於或等於子節點。刪除最小值時,以最後一個節點補到根,再沿著較小的子節點向下調整。

AVL 樹是高度平衡的二元搜尋樹。每個節點的左右子樹高度差絕對值不得超過 11。刪除有兩個子節點的節點時,以下採用常見作法:以其中序後繼取代,再刪除原後繼節點。

解題方法

依第 1 題給定的輸入順序 60,35,11,45,8,72,660,35,11,45,8,72,6,逐一插入兩種樹。

① Min-heap 刪除 66

逐一插入並維持 min-heap,陣列表示如下:

插入值Heap 陣列
6060[60][60]
3535[35,60][35,60]
1111[11,60,35][11,60,35]
4545[11,45,35,60][11,45,35,60]
88[8,11,35,60,45][8,11,35,60,45]
7272[8,11,35,60,45,72][8,11,35,60,45,72]
66[6,11,8,60,45,72,35][6,11,8,60,45,72,35]

刪除根節點 66,以最後一個值 3535 補到根:

[35,11,8,60,45,72][35,11,8,60,45,72]

根的兩個子節點為 1111 與 88,先和較小的 88 交換,得到:

[8,11,35,60,45,72][8,11,35,60,45,72]

最後的 heap tree 為:

        8
      /   \
    11     35
   /  \    /
 60   45  72

② AVL tree 刪除 3535

🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 3 題15 分

【此題15分】下圖為「雙向環狀串列(doubly circular linked list)」的資料結構範例,
head
31
25
79
tail
64
prev next prev next prev next prev next

其中每個 Node 結構包含三個欄位「prev、data、next」;更具體地說,下方為 Node 結構的宣告:
struct Node {
Node* prev; //指向前一個 Node
int data;
Node* next; //指向下一個 Node
};
雙向環狀串列裡頭包含二個指標變數:head 和tail。指標變數 head 永遠指向串列裡頭的第一個 Node,指標變數 tail 永遠指向串列裡頭的最後一個Node。請寫出 push_back 函式(function)的程式碼,其宣告為 void push_back(int d),其功能是在雙向環狀串列裡頭增加一個 Node,其 data 欄位值為d,並且限定「此一 Node 在加入雙向環狀串列之後,必須成為雙向環狀串列裡頭的最後一個 Node」。【註】:push_back 函式必須考慮雙向環狀串列在一開始,完全沒有任何 Node 的情況,此時 head 和 tail 的初始值皆為 NULL。

🖼️ 本題含圖表,以下為原卷對應頁面:
原卷第 2 頁

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

雙向環狀串列的每個節點都有 prev 與 next 指標。若串列非空,頭尾相接:

  • head->prev 指向 tail
  • tail->next 指向 head

push_back(d) 要把新節點接在原本的 tail 後方,並更新 tail。空串列則需讓新節點同時成為 head 與 tail,且自行形成環。

解題方法

分成空串列與非空串列處理:

  1. 空串列:建立新節點,令 prev、next 都指向自己,再令 head、tail 都指向新節點。
  2. 非空串列:新節點的前一個節點設為舊 tail,下一個節點設為 head;接著更新舊尾節點與頭節點的連結,最後將 tail 更新為新節點。
🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 4 題15 分

【此題15分】請將後序運算式(postfix expression)
AB*CDEF+ /
轉為中序運算式(infix expression)

🖼️ 本題含圖表,以下為原卷對應頁面:
原卷第 3 頁

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

後序運算式的規則是:運算子遇到時,從堆疊取出右運算元與左運算元,組合成

左運算元 運算子 右運算元\text{左運算元}\ \text{運算子}\ \text{右運算元}

二元運算式必須滿足:

運算元數=運算子數+1\text{運算元數}=\text{運算子數}+1

解題方法

題目文字給出的後序式為:

AB∗CDEF+/AB*CDEF+/

其中運算元為 A,B,C,D,E,FA,B,C,D,E,F,共 66 個;運算子為 ∗,+,/*,+ ,/,共 33 個。

但完整二元後序式需要 6−1=56-1=5 個運算子,因此題目少了 22 個運算子。

依序使用堆疊處理:

讀入符號堆疊內容
AAAA
BBA,BA,B
∗*AB∗AB*
CCAB∗,CAB*,C
DDAB∗,C,DAB*,C,D
🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

其他考古題