BFS演算法框架

2022-03-03 20:05:14 字數 1467 閱讀 2344

bfs演算法框架

bfs的核心思想,就是把一些問題抽象成圖,從乙個節點開始,向四周擴散。一般來說,寫bfs都是用[佇列]這個資料結構,每次將乙個節點周圍的節點加入到隊尾。

先舉例⼀下 bfs 出現的常⻅場景好吧,問題的本質就是讓你在⼀幅「圖」 中找到從起點 start 到終點 target 的最近距離, 這個例⼦聽起來很枯燥, 但是 bfs 演算法問題其實都是在⼲這個事⼉, 把枯燥的本質搞清楚了, 再去欣賞各種問題的包裝才能胸有成竹嘛。

這些問題都沒啥奇技淫巧, 本質上就是⼀幅「圖」 , 讓你從⼀個起點, ⾛到終點, 問最短路徑。 這就是 bfs 的本質,框架搞清楚了直接默寫就好。

bfs框架:

int bfs(node start, node target)}}

// 劃重點,更新步數在這裡

step++;

}}

其中,cur.adj()表示節點cur的相鄰節點(圖即鄰接點,樹即子節點)。

經典例題一:二叉樹的最小高度(leetcode.111)

怎麼套到 bfs 的框架⾥呢?⾸先明確⼀下起點 start 和終點 target 是什麼,怎麼判斷到達了終點?顯然起點就是 root 根節點, 終點就是最靠近根節點的那個「葉⼦節點」嘛, 葉⼦節點就是兩個⼦節點都是 null 的節點:

if(cur->left == nullprt && cur->right == nullptr)

//到達葉子結點,返回

那麼,按照bfs框架稍加改造:
#include /**

* definition for a binary tree node.

* struct treenode

* };

*/class solution

// 劃重點,更新步數在這裡

depth++;

}return depth;

}};

經典例題二:開啟轉盤鎖(leetcode.752)

直接上**:

#include #include class solution 

// 將s[i]向下撥

string minusone(string s, int i)

int bfs(vector&deadends, string target)

// 將該結點的所有子節點加入隊尾

for(int i = 0; i < 4; i++)

if(visited.find(adjminus) == visited.end())}}

step++;

}return -1;

}int openlock(vector& deadends, string target)

};

BFS 演算法解題套路框架

bfs 的核心思想應該不難理解的,就是把一些問題抽象成圖,從乙個點開始,向四周開始擴散。一般來說,我們寫 bfs 演算法都是用 佇列 這種資料結構,每次將乙個節點周圍的所有節點加入佇列。特點 bfs 找到的路徑一定是最短的,但代價就是空間複雜度可能比 dfs 大很多 問題的本質就是讓你在一幅 圖 中...

BFS 廣度搜尋 演算法框架

一般bfs和資料結構中的佇列聯絡比較緊密 1.演算法框架 計算的是迷宮,從起點出發,到達終點,走的步數。計算從起點 start 到終點 target 的最近距離 intbfs node start,node target 劃重點 更新步數在這裡 step 2.二叉樹的最小高度 套模板 二叉樹的最小深...

廣度優先搜尋BFS框架

廣度優先搜尋與深度優先搜尋是兩種不同的搜尋方式。比如回答從地圖上的某點到另外一點是否可達,一般可以採用深搜。而問從某點到另外點的最短路徑長度可以採用廣度搜尋,因為在有解的前提下,廣度優先搜尋是按層遍歷的,可以保證到達解時所用的路徑最短。下面的例子是抓住那頭牛的ac 使用了廣度優先搜尋的方法解題。in...