111 年 國立中山大學電機工程學系碩士班丙組《資料結構》
第 1 題30 分
【每一小題10分,共30分】依序輸入正整數60、35、11、45、8、72、6。
① 請依據上述輸入次序,建造一棵 binary search tree。
② 請依據上述輸入次序,建造一棵 min-heap tree。
③ 請依據上述輸入次序,建造一棵 AVL tree。
【註】:在每個小題裡,都必須畫出在每增加一個整數之後的樹狀結構,不可直接畫出最後答案;直接畫出最後答案,該小題以0分計算。
登入後即可作答並保存紀錄。
核心觀念
- 二元搜尋樹(BST):每個節點的左子樹鍵值小於該節點,右子樹鍵值大於該節點。新值從根節點開始比較,直到找到空位置插入。
- 最小堆積(min-heap):必須是完全二元樹,且每個父節點的值都小於或等於子節點。新值先放在下一個可用位置,再沿父節點方向向上調整。
- AVL 樹:每個節點左右子樹高度差的絕對值不得大於 。若插入後失衡,依失衡型態進行旋轉。
解題方法
依序插入 。以下每個步驟都畫出新增一個整數後的樹。
① 二元搜尋樹
依大小比較決定插入位置,不進行旋轉。
插入
60
插入
60
/
35
插入
60
/
35
/
11
插入
60
/
35
/ \
11 45
插入
60
/
35
/ \
11 45
/
8
插入
60
/ \
35 72
/ \
11 45
/
8
插入
60
/ \
35 72
/ \
11 45
/
8
/
6
② 最小堆積
新值先放在完全二元樹的下一個空位,再與父節點比較;若新值較小,就交換並繼續向上調整。
插入
60
插入 :,與父節點交換。
35
/
60
插入 :,與父節點交換。
11
/ \
60 35
插入 :,與父節點交換。
11
/ \
45 35
/
60
插入 :依序與 交換。
8
/ \
11 35
/ \
60 45
第 2 題30 分
【每一小題15分,共30分】承上題,
① 在建造完畢的 min-heap tree 裡頭刪除「6」之後的 min-heap tree 為何?請畫出來。
② 在建造完畢的 AVL tree 裡頭刪除「35」之後的 AVL tree 為何?請畫出來。
登入後即可作答並保存紀錄。
核心觀念
Min-heap 必須符合兩個條件:完全二元樹的形狀,以及每個父節點的鍵值都小於或等於子節點。刪除最小值時,以最後一個節點補到根,再沿著較小的子節點向下調整。
AVL 樹是高度平衡的二元搜尋樹。每個節點的左右子樹高度差絕對值不得超過 。刪除有兩個子節點的節點時,以下採用常見作法:以其中序後繼取代,再刪除原後繼節點。
解題方法
依第 1 題給定的輸入順序 ,逐一插入兩種樹。
① Min-heap 刪除
逐一插入並維持 min-heap,陣列表示如下:
| 插入值 | Heap 陣列 |
|---|---|
刪除根節點 ,以最後一個值 補到根:
根的兩個子節點為 與 ,先和較小的 交換,得到:
最後的 heap tree 為:
8
/ \
11 35
/ \ /
60 45 72
② AVL tree 刪除
第 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。
登入後即可作答並保存紀錄。
核心觀念
雙向環狀串列的每個節點都有 prev 與 next 指標。若串列非空,頭尾相接:
head->prev指向tailtail->next指向head
push_back(d) 要把新節點接在原本的 tail 後方,並更新 tail。空串列則需讓新節點同時成為 head 與 tail,且自行形成環。
解題方法
分成空串列與非空串列處理:
- 空串列:建立新節點,令
prev、next都指向自己,再令head、tail都指向新節點。 - 非空串列:新節點的前一個節點設為舊
tail,下一個節點設為head;接著更新舊尾節點與頭節點的連結,最後將tail更新為新節點。
第 4 題15 分
【此題15分】請將後序運算式(postfix expression)
AB*CDEF+ /
轉為中序運算式(infix expression)
登入後即可作答並保存紀錄。
核心觀念
後序運算式的規則是:運算子遇到時,從堆疊取出右運算元與左運算元,組合成
二元運算式必須滿足:
解題方法
題目文字給出的後序式為:
其中運算元為 ,共 個;運算子為 ,共 個。
但完整二元後序式需要 個運算子,因此題目少了 個運算子。
依序使用堆疊處理:
| 讀入符號 | 堆疊內容 |
|---|---|