115 年 國立中正大學資訊管理學系碩士班乙組《資料結構》

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

第 1 題10 分

  1. For the list, (A (B (E (Z, L, K), F ), D (H (M), P, C (W), O (X)))), please:
    (a) draw the corresponding tree for the list; (5%)
    (b) Please transform the tree to a binary tree and draw this binary tree. (5%)
🖼️ 本題含圖表,以下為原卷對應頁面:
原卷第 2 頁

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

這一題的完整詳解

核心觀念

本題考多元樹的表示法,以及將一般樹轉換為二元樹的左子女-右兄弟表示法:

  • 一般樹中,每個節點可有多個子女,子女順序依題目列出的順序。
  • 轉成二元樹時,每個節點的左子節點指向它的第一個子女;右子節點指向它的下一個兄弟。
  • 因此,二元樹中的右子鏈代表一般樹中同一父節點下的兄弟,不代表一般樹中的子女。

解題方法

先依括號中的巢狀結構整理各節點的子女:

  • AA 的子女:B,DB,D
  • BB 的子女:E,FE,F
  • EE 的子女:Z,L,KZ,L,K
  • DD 的子女:H,P,C,OH,P,C,O
  • HH 的子女:MM
  • CC 的子女:WW
  • OO 的子女:XX

(a) 對應的一般樹

A
├── B
│   ├── E
│   │   ├── Z
│   │   ├── L
│   │   └── K
│   └── F
└── D
    ├── H
    │   └── M
    ├── P
    ├── C
    │   └── W
    └── O
        └── X

(b) 轉換後的二元樹

左邊表示左子女,右邊表示右兄弟:

🔒

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

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

免費註冊

第 2 題10 分

  1. For the following graph,
    🖼️【此處有附圖,請對照原卷】
    (a) please write its corresponding adjacent matrix and adjacent list. (5%)
    (b) please write an algorithm or pseudo code to reply how many isolated parts in a graph. In this example, the answer of the algorithm will be 2. (5%)
🖼️ 本題含圖表,以下為原卷對應頁面:
原卷第 2 頁

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

這一題的完整詳解

核心觀念

有向圖的鄰接矩陣以 Aij=1A_{ij}=1 表示存在由頂點 ii 指向頂點 jj 的邊,沒有邊則記為 00;鄰接串列則列出每個頂點的所有出邊終點。

計算圖中的「孤立部分」時,本題依題目給的結果 22,採用弱連通分量:忽略箭頭方向後,彼此可連通的一群頂點算一個部分。

解題方法

圖中頂點為 11 至 66。依箭頭方向讀出邊為
1→21\to2、2→12\to1、2→32\to3、2→42\to4、3→33\to3、4→14\to1、4→34\to3、5→65\to6;其中 3→33\to3 是自我迴圈。

以頂點 1,2,3,4,5,61,2,3,4,5,6 依序作為鄰接矩陣的列與欄,得到:

A=123456101000021011003001000410100050000016000000A= \begin{array}{c|cccccc} & 1&2&3&4&5&6\\\hline 1&0&1&0&0&0&0\\ 2&1&0&1&1&0&0\\ 3&0&0&1&0&0&0\\ 4&1&0&1&0&0&0\\ 5&0&0&0&0&0&1\\ 6&0&0&0&0&0&0 \end{array}

依各頂點的出邊整理鄰接串列:

頂點鄰接串列
12
21, 3, 4
33
41, 3
56
6∅\varnothing

計算弱連通分量時,把每條有向邊視為無向連線,再以深度優先搜尋或廣度優先搜尋逐一標記頂點。每遇到尚未拜訪的頂點,就代表找到一個新的分量,計數加一。

🔒

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

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

免費註冊

第 3 題10 分

  1. Please draw AVL tree, from empty AVL tree and then read the input one by one for the following six keys, w, y, a, m, t, I. The rotation of the tree may be needed. (10%)

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

這一題的完整詳解

核心觀念

題目未明訂大小寫的比較規則;以下採一般字母字典序、不區分大小寫,將 I 視為字母 i,因此:

a<I<m<t<w<ya<I<m<t<w<y

AVL 樹是具有自我平衡功能的二元搜尋樹。每個節點的平衡因子定義為:

BF(v)=h(左子樹)−h(右子樹)BF(v)=h(\text{左子樹})-h(\text{右子樹})

AVL 樹必須滿足:

∣BF(v)∣≤1|BF(v)|\leq 1

本題採空樹高度為 00、葉節點高度為 11。插入新鍵值時,先依二元搜尋樹規則放置,再由插入位置向上檢查平衡因子。第一個失衡節點需要旋轉:

  • 左左型(LL):右旋
  • 右右型(RR):左旋
  • 左右型(LR):先左旋,再右旋
  • 右左型(RL):先右旋,再左旋

逐步插入與旋轉

第 1 個鍵值:w

w

第 2 個鍵值:y

因為 y>wy>w,插入 w 的右子樹。

w
 \
  y

w 的平衡因子為 −1-1,仍符合 AVL 條件。

第 3 個鍵值:a

因為 a<wa<w,插入 w 的左子樹。

  w
 / \
a   y

w 的平衡因子為 00。

第 4 個鍵值:m

比較路徑為:

m<w,m>am<w,\qquad m>a

因此 m 插入 a 的右子樹。

    w
   / \
  a   y
   \
    m

此時:

BF(a)=0−1=−1BF(a)=0-1=-1

BF(w)=2−1=1BF(w)=2-1=1

整棵樹仍然平衡。

第 5 個鍵值:t

比較路徑為:

t<w,t>a,t>mt<w,\qquad t>a,\qquad t>m

因此 t 插入 m 的右子樹。

      w
     / \
    a   y
     \
      m
       \
        t

此時 a 的右子樹高度為 22:

BF(a)=0−2=−2BF(a)=0-2=-2

m 的平衡因子為 −1-1,因此 a 屬於右右型(RR),對 a 做一次左旋:

🔒

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

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

免費註冊

第 4 題10 分

  1. Please draw the expression (binary) tree for the following expression, A*b-c/(d-e)*f+g+h*(-j). Then write the pre-order algorithm for the pre-order traversing. (10%)

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

這一題的完整詳解

表達式二元樹

          (+)
        /     \
      (+)      (*)
     /   \    /   \
   (-)    g  h    (-)
  /   \        \
(*)    (*)       j
/ \    / \
A   b  /   f
      / \
     c   (-)
        /   \
       d     e

前序走訪 (Pre‑order) 演算法(遞迴版)

🔒

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

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

免費註冊

第 5 題20 分

  1. Recursion a type of divide-and-conquer technique in algorithmic perspective, which is composed by boundary condition(s) and formula for problem-size reduction. (a) Please write a recursive function to calculate the function, f(n)=3nf(n) = 3^n, nn is positive integer, and indicate the boundary condition. (10%); (b) Please write the recursive program for the function f(n)f(n). (10%).

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

這一題的完整詳解

核心觀念

遞迴函式必須包含兩個部分:

  1. 邊界條件(boundary condition):問題規模小到可直接求解時停止遞迴。
  2. 遞迴關係式(recurrence formula):將原問題轉換成規模較小的同類問題。

由於

3n=3⋅3n−1,3^n=3\cdot 3^{n-1},

因此可將函數定義為

f(n)={3,n=1,3f(n−1),n>1.f(n)= \begin{cases} 3, & n=1,\\ 3f(n-1), & n>1. \end{cases}

其中 f(1)=3f(1)=3 是邊界條件。


解題方法

每次將指數 nn 減少 11,並在結果外乘上 33:

f(n)=3f(n−1)=3(3f(n−2))=32f(n−2)⋯=3n−1f(1)=3n−1⋅3=3n.\begin{aligned} f(n)&=3f(n-1)\\ &=3\left(3f(n-2)\right)\\ &=3^2f(n-2)\\ &\cdots\\ &=3^{n-1}f(1)\\ &=3^{n-1}\cdot 3\\ &=3^n. \end{aligned}

因此遞迴函式如下:

Function f(n)
    if n == 1 then
        return 3
    else
        return 3 * f(n - 1)

前提是輸入 nn 為正整數。

若採用 f(0)=1f(0)=1 作為邊界條件,也可寫成:

f(n)={1,n=0,3f(n−1),n>0.f(n)= \begin{cases} 1, & n=0,\\ 3f(n-1), & n>0. \end{cases}

兩種寫法皆正確;本題因指定 nn 為正整數,使用 f(1)=3f(1)=3 最直接。


(a) 遞迴函式

int f(int n) {
    if (n == 1) {          // boundary condition
        return 3;
    }

    return 3 * f(n - 1);   // recursive case
}

例如:

f(4)=3f(3)=3(3f(2))=3(3(3f(1)))=34=81.f(4)=3f(3)=3(3f(2))=3(3(3f(1)))=3^4=81.

(b) 遞迴程式

以下為完整的 C 語言程式:

🔒

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

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

免費註冊

第 6 題20 分

  1. (a) Please write the shortest path algorithm (or pseudo codes) to find the shortest path from given starting node to all other nodes in a graph (i.e., a minimal spanning tree by Dijkstra's algorithm) (10%). (b) Please draw the spanning tree with the least cost from node 0 for the tree in the following graph where the number between two nodes are the cost of the path. (10%)
    🖼️【此處有附圖,請對照原卷】
🖼️ 本題含圖表,以下為原卷對應頁面:
原卷第 2 頁

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

這一題的完整詳解

核心觀念

本題考查 Dijkstra 最短路徑演算法。給定起點後,求出起點到所有其他節點的最短距離,並以 predecessor 記錄各節點的前一個節點,形成「最短路徑樹」(Shortest Path Tree)。

Dijkstra 演算法適用於所有邊權重皆為非負數的圖。它不等同於最小生成樹(Minimum Spanning Tree, MST);最小生成樹追求整棵樹的總邊權重最小,Dijkstra 則追求「從指定起點到各節點的路徑個別最短」。

解題方法

設定:

  • dist[v]:起點 ss 到節點 vv 的目前最短距離
  • prev[v]:最短路徑中,節點 vv 的前一個節點
  • visited[v]:節點 vv 是否已確定最短距離

初始化:

dist[s]=0dist[s] = 0 dist[v]=∞(v≠s)dist[v] = \infty \quad (v \ne s)

每次從尚未確定的節點中,選出 dist 最小者 uu,再檢查 uu 的所有鄰接節點 vv。若經過 uu 到 vv 的距離更短,便進行鬆弛(relaxation):

若 dist[u]+w(u,v)<dist[v]\text{若 } dist[u] + w(u,v) < dist[v]

則更新:

dist[v]=dist[u]+w(u,v)dist[v] = dist[u] + w(u,v) prev[v]=uprev[v] = u

Dijkstra 演算法虛擬碼

🔒

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

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

免費註冊

第 7 題20 分

  1. Continue for the above graph, (a) please write the algorithm (or pseudo codes) to find the shortest path given the starting node and end node. (10%) (hint: you can use the dynamic programming technique like Bellman-Ford algorithm); (b) Please use the find the shortest path from node 0 to node 3 (10%)
    🖼️【此處有附圖,請對照原卷】
🖼️ 本題含圖表,以下為原卷對應頁面:
原卷第 2 頁

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

這一題的完整詳解

核心觀念

本題考單源最短路徑。Bellman–Ford 演算法透過反覆「鬆弛」邊,逐步更新起點到各節點的最短距離,適用於含負權重邊的圖;若有負權重環,則不存在有限的最短路徑。

令 dk(v)d_k(v) 表示從起點到節點 vv、最多經過 kk 條邊的最短距離,則:

dk(v)=min⁡(dk−1(v), min⁡(u,v)∈E[dk−1(u)+w(u,v)])d_k(v)=\min\left(d_{k-1}(v),\ \min_{(u,v)\in E}\left[d_{k-1}(u)+w(u,v)\right]\right)

圖中邊沒有方向箭頭,因此視為無向圖;實作時,每條邊都要以兩個方向進行鬆弛。

解題方法

以節點 00 為起點、節點 33 為終點。圖上相關邊包括:

  • 00–11:4、00–77:8
  • 11–22:8、77–66:1
  • 66–55:2、22–55:4
  • 22–33:7、55–33:14、44–33:9、55–44:10

依 Bellman–Ford 更新距離,與抵達節點 33 有關的節點距離為:

  • 到節點 22:0→1→20\to1\to2,距離 4+8=124+8=12
  • 到節點 55:0→7→6→50\to7\to6\to5,距離 8+1+2=118+1+2=11
  • 到節點 44:0→7→6→5→40\to7\to6\to5\to4,距離 8+1+2+10=218+1+2+10=21

節點 33 可由 22、55 或 44 抵達,對應距離分別為:

0→1→2→3:12+7=190→7→6→5→3:11+14=250→7→6→5→4→3:21+9=30\begin{aligned} 0\to1\to2\to3 &: 12+7=19\\ 0\to7\to6\to5\to3 &: 11+14=25\\ 0\to7\to6\to5\to4\to3 &: 21+9=30 \end{aligned}

因此,最短路徑為 0→1→2→30\to1\to2\to3,總長度為 1919。

演算法偽碼

🔒

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

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

免費註冊

其他考古題