总的来说,BFS首先将问题抽象为一个图,从一个起点开始均匀的向四周扩散,比如二叉树这种结构,从root开始下一步同时遍历root.left和root.right,一般BFS需要配合队列这种数据结构,每次一个节点出队就将其附近的节点入队。
BFS相对DFS最主要的区别是:BFS找的的路径一定是最短的,代价是空间复杂度比DFS大很多。
再说一个重点,什么样的问题需要用到BFS?
这样的问题本质就是在抽象出来的图上,找到起点start到终点target的最短路径,听起来是个最值问题是不是想到了动态规划,后面再来说两者的区别。当遇到迷宫问题、连连看游戏这种,花里胡哨的背景下,本质都是找到起点到终点的最短路径。
举个例子:
LeetCode有一题,求二叉树的最小深度
class Solution:
def minDepth(self, root: TreeNode) -> int:
# 特例情况处理
if not root: return 0
# 创建队列并把start入队
q = Queue()
q.put(root)
# 维护每个节点的属性
size = 1
depth = 1
while q:
for i in range(size):
cur = q.get()
size -= 1
# 判断是否到达终点
if not cur.left and not cur.right:
return depth
# 扩散
if cur.left:
q.put(cur.left)
size += 1
if cur.right:
q.put(cur.right)
size += 1
depth += 1