已訪問節點數:0
紅色為當前處理節點;黃框為佇列中待處理(frontier);綠色為已處理;綠色粗邊為遍歷樹;節點上方數字為訪問序號。
想在迷宮裡找出口,或想知道「朋友的朋友」一路能牽到哪些人,都得從一個點出發、把走得到的地方全逛一遍——這就是圖遍歷。差別只在「下一個先看誰」:BFS 廣度優先像把石頭丟進水裡,漣漪一圈一圈往外擴,先看最近的鄰居再往外一層;DFS 深度優先則像走迷宮認準一條路走到底,撞牆了才退回上個岔口換條路。兩種走法沒有好壞,只看你要「就近找最短」還是「一路鑽到底」。下面你會看到它們在同一張圖上,訪問順序如何不同。
從一個起點出發,系統性地走訪圖上每一個可達節點,是幾乎所有圖演算法的基礎。差別只在「下一個處理誰」的順序:
把起點標記已訪問並入佇列;反覆從隊首取出節點處理,把它所有未訪問的鄰居(id 升序)標記已訪問並入佇列尾端。 佇列的 FIFO 特性使得越早入佇列(離起點越近)的節點越早被處理,形成逐層擴展。
顯式棧版:把起點推入棧;反覆從棧頂彈出,若未訪問才記錄,並把它的鄰居反向(id 降序)推入棧,使彈出順序為 id 升序、與遞迴版一致。 棧的 LIFO 特性使得最後推入的鄰居最先被處理,因此會沿一條路一直深入到底,再回頭走其他分支。 (棧中同一節點可能被重複推入,彈出時才判定是否已訪問,故棧空間為 O(V+E)。)