廣度優先搜尋(BFS)解題總結
阿新 • • 發佈:2020-08-21
定義
廣度優先搜尋演算法(Breadth-First-Search),是一種圖形搜尋演算法。
簡單的說,BFS是從根節點開始,沿著樹(圖)的寬度遍歷樹(圖)的節點。
如果所有節點均被訪問,則演算法中止。
BFS同樣屬於盲目搜尋。
一般用佇列資料結構來輔助實現BFS演算法。
如下圖,其廣度優先演算法的遍歷順序為:1->2->3->4->5->6->7->8
演算法步驟
- 首先將根節點放入佇列中。
- 從佇列中取出第一個節點,並檢驗它是否為目標。如果找到目標,則結束搜尋並回傳結果。否則將它所有尚未檢驗過的直接子節點加入佇列中。
- 若佇列為空,表示整張圖都檢查過了——亦即圖中沒有欲搜尋的目標。結束搜尋並回傳“找不到目標”。
- 重複步驟2。
演算法模板
# Python
def BFS(root):
visited = set()
queue = []
queue.append([root])
while queue:
node = queue.pop()
visited.add(node)
process(node)
nodes = generate_related_nodes(node)
queue.push(nodes)
# other processing work
// Golang type TreeNode struct { Val int Left *TreeNode Right *TreeNode } func BFS(root *TreeNode){ visited := make(map[*TreeNode]bool) queue := make([]*TreeNode,0) queue = append(queue, root) for len(queue)>0{ node := queue[0] queue = queue[1:] visited[node] = true process(node) nodes := generate_related_nodes(node) queue = append(queue, nodes...) } // other processing work }
要點
- 使用佇列 queue
- 記錄已訪問節點 visited ,通常使用雜湊表
- 一般要抽象成樹、圖等模型
適用場景
- 樹
- 圖
- 二維陣列