廣度優先搜索(BFS)解題總結


定義

廣度優先搜索算法(Breadth-First-Search),是一種圖形搜索算法。

簡單的說,BFS是從根節點開始,沿着樹(圖)的寬度遍歷樹(圖)的節點。

如果所有節點均被訪問,則算法中止。

BFS同樣屬於盲目搜索。

一般用隊列數據結構來輔助實現BFS算法。

如下圖,其廣度優先算法的遍歷順序為:1->2->3->4->5->6->7->8

image

算法步驟

  1. 首先將根節點放入隊列中。
  2. 從隊列中取出第一個節點,並檢驗它是否為目標。如果找到目標,則結束搜尋並回傳結果。否則將它所有尚未檢驗過的直接子節點加入隊列中。
  3. 若隊列為空,表示整張圖都檢查過了——亦即圖中沒有欲搜尋的目標。結束搜尋並回傳“找不到目標”。
  4. 重復步驟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 ,通常使用哈希表
  • 一般要抽象成樹、圖等模型

適用場景

  • 二維數組

實戰題目

參考資料


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM