← 回首頁

圖遍歷(Graph Traversal)

想在迷宮裡找出口,或想知道「朋友的朋友」一路能牽到哪些人,都得從一個點出發、把走得到的地方全逛一遍——這就是圖遍歷。差別只在「下一個先看誰」:BFS 廣度優先像把石頭丟進水裡,漣漪一圈一圈往外擴,先看最近的鄰居再往外一層;DFS 深度優先則像走迷宮認準一條路走到底,撞牆了才退回上個岔口換條路。兩種走法沒有好壞,只看你要「就近找最短」還是「一路鑽到底」。下面你會看到它們在同一張圖上,訪問順序如何不同。

從一個起點出發,系統性地走訪圖上每一個可達節點,是幾乎所有圖演算法的基礎。差別只在「下一個處理誰」的順序:

兩個 section 使用同一張圖,方便對比相同起點下佇列與棧造成的訪問順序差異。節點上方的數字是訪問序號,綠色邊為遍歷樹

1. BFS 廣度優先搜尋(佇列)

把起點標記已訪問並入佇列;反覆從隊首取出節點處理,把它所有未訪問的鄰居(id 升序)標記已訪問並入佇列尾端。 佇列的 FIFO 特性使得越早入佇列(離起點越近)的節點越早被處理,形成逐層擴展。

起點:
已訪問節點數:0
紅色為當前處理節點;黃框為佇列中待處理(frontier);綠色為已處理;綠色粗邊為遍歷樹;節點上方數字為訪問序號。

佇列內容(隊首 → 隊尾)

訪問順序

2. DFS 深度優先搜尋(棧)

顯式棧版:把起點推入棧;反覆從棧頂彈出,若未訪問才記錄,並把它的鄰居反向(id 降序)推入棧,使彈出順序為 id 升序、與遞迴版一致。 棧的 LIFO 特性使得最後推入的鄰居最先被處理,因此會沿一條路一直深入到底,再回頭走其他分支。 (棧中同一節點可能被重複推入,彈出時才判定是否已訪問,故棧空間為 O(V+E)。)

起點:
已訪問節點數:0
紅色為當前處理節點;黃框為棧中待處理(frontier);綠色為已處理;綠色粗邊為遍歷樹;節點上方數字為訪問序號。

棧內容(底 → 頂,頂為下一個彈出)

訪問順序