112 關務特考三等 資訊處理 資料結構 考古題詳解
第 一 題25 分
將中序運算式轉換成後序運算式常使用堆疊資料結構。如相同問題改成使用二元樹資料結構來儲存一中序運算式,以中序運算式 為例,畫出表示此中序運算式的二元樹,並依前序(Preorder)與後序(Postorder)列出拜訪(Visit)此二元樹的順序。
登入後即可作答並保存紀錄。
核心觀念
本題考查運算式的運算子優先順序與結合律,以及二元運算式樹的三種走訪方式。
*、/的優先順序高於+、-。- 同一優先順序的二元運算子依左至右結合。
- 運算式樹的葉節點是運算元,本題為 ;內部節點是運算子。
- 前序走訪:根、左子樹、右子樹。
- 後序走訪:左子樹、右子樹、根。
解題方法
先依優先順序與左至右結合規則,將中序運算式加上括號:
再依運算式的結構建立二元樹。整體運算的最外層是由左至右結合的減法,因此根節點是最後一個 -;它的左子樹表示 ,右子樹表示 。
-
/ \
+ *
/ \ / \
- * A C
/ \ / \
/ C D E
/ \
A B
樹中最左側的 / 子樹表示 ;其結果再與 相減,接著加上 ,最後減去 。
第 二 題25 分
用 表示一個無方向性圖形,其中 是點的集合, 是一組節點(Vertices)形成邊的集合。
今有一圖形 ,其中:
每一個邊對應的權重值分別為 。
請用相鄰矩陣(Adjacency Matrix)與相鄰串列(Adjacency List)表示此圖形,並使用 Prim’s 演算法,計算最小成本擴張樹(Minimum Cost Spanning Tree),依序寫出從點 加入邊的順序,最小成本擴張樹的權重總和為何?
登入後即可作答並保存紀錄。
核心觀念
本題考無向加權圖的相鄰矩陣、相鄰串列,以及以 Prim 演算法求最小成本擴張樹(Minimum Cost Spanning Tree, MST)。
無向圖的邊 表示 與 互相相鄰;在相鄰矩陣中,矩陣對稱,頂點到自身的對角線值為 ,沒有邊的頂點對以 表示。相鄰串列則逐一列出每個頂點相鄰的頂點及邊權重。
Prim 演算法從指定起點開始,每一步選擇一條「一端在已加入頂點集合內、另一端在集合外」且權重最小的邊,直到所有頂點都加入。對 的連通圖,擴張樹包含 條邊。
解題方法
依題目邊的列舉順序,權重對應如下:
| 邊 | 權重 |
|---|---|
相鄰矩陣
頂點順序採 。矩陣中的權重依序填入;未直接相連的頂點對以 表示。
相鄰串列
每條無向邊在兩端頂點的串列中各列一次:
第 三 題25 分
給予一串資料 ,依序畫出產生 2-3 樹(Order 3 的 B-Tree)的過程,之後依序畫出刪除 、 與 的 2-3 樹。
登入後即可作答並保存紀錄。
核心觀念
2-3 樹是階序為 3 的 B 樹。每個節點可存 1 或 2 個遞增的鍵值,分別稱為 2-節點與 3-節點;除根節點外,每個內部節點有 2 或 3 個子節點。所有葉節點位於同一層,因此樹保持平衡。
插入時,先將新鍵值放入適當葉節點。若節點暫時有 3 個鍵,便將中間鍵提升至父節點,左右兩鍵分別形成子節點;若父節點也滿載,則繼續向上分裂。刪除時,若刪除內部節點中的鍵,先以其前驅或後繼鍵替換,再從葉節點刪除;若因此產生空節點,則向兄弟借鍵或與兄弟合併,維持 2-3 樹的節點容量與葉深度。
解題方法:依序插入
以下以方括號表示節點中的鍵值;同一括號內的鍵值屬於同一節點。
- 插入 、:兩個鍵可放在根節點。
- 插入 :根節點暫時有三個鍵 ,將中間鍵 提升為新根。
- 插入 :,放入左葉節點。
- 插入 :左葉節點暫時成為 ,提升中間鍵 至根。根成為 ,兩側葉節點分別為 與 。
- 插入 :,放入最右葉節點。
- 插入 :最右葉節點暫時成為 ,提升中間鍵 至根。根暫時成為 ,再分裂並提升中間鍵 為新根。
- 插入 : 且 ,放入最右葉節點。
因此,依序插入全部資料後的 2-3 樹如上。
解題方法:依序刪除
刪除
第 四 題25 分
給予如下程式片段,假設 ,請只用下述 C 語言宣告的變數及兩個 for 迴圈,完成下面的選擇排序(Selection Sort)。
假設有 個資料要由小排到大,每一外迴圈將最大值放在第 個位置,然後第二大的資料放在第 個位置,依此類推,將資料放到適當的位置,執行後陣列 內容由小排至大。
Selectsort(x, n)
int x[], n;
{
int i, index, j, large;
for (i = n-1; i > 0; i--) {
for (j = 1; j <= i; j++) {
}
}
}
登入後即可作答並保存紀錄。
核心觀念
選擇排序每一趟都在尚未排好的部分中找出最大值,並將它放到該部分的最右端。外迴圈令 從 遞減至 ,表示本趟要把最大值放到索引 ;內迴圈則逐一比較索引 到 的元素,記錄最大值的位置。
解題方法
index 記錄目前最大值的索引,large 暫存最大值。每趟先假設索引 的元素最大,再由索引 掃描至 ;遇到更大的元素時更新 large 和 index。掃描結束後,將最大值與索引 的元素交換。
Selectsort(x, n)
int x[], n;
{
int i, index, j, large;
for (i = n-1; i > 0; i--) {
index = 0;
large = x[0];
for (j = 1; j <= i; j++) {
if (x[j] > large) {
large = x[j];
index = j;
}
}
x[index] = x[i];
x[i] = large;
}
}
以題目陣列為例:
- 第 1 趟掃描索引 至 ,最大值 在索引 ,與索引 的 交換:
[25,57,48,37,12,33,86,92]