什么是广度优先算法? 代码示范

22 min read

广度优先算法(BFS)是一种基于图的遍历算法,一般用于查找图或树结构中的最短路径。

BFS 基于队列实现,将某一节点周围的所有节点放入队列中,并从队列中取出节点,依次遍历它的周围节点,直至遍历完整个图或找到目标节点。

以下是 Python 语言的 BFS 代码示范:

# 定义节点类
class Node:
    def __init__(self, val=None, neighbors=None):
        self.val = val
        self.neighbors = neighbors or []

# 定义 BFS 函数
def bfs(node: Node, target: Node) -> Node:
    if not node or not target:
        return None
    if node == target:
        return node
    queue = []      # 定义队列
    visited = set()     # 定义已访问节点集合
    queue.append(node)
    visited.add(node)
    while queue:
        cur = queue.pop(0)      # 从队列中取出节点并遍历
        if cur == target:
            return cur
        for neighbor in cur.neighbors:      # 遍历当前节点的周围节点
            if neighbor not in visited:
                queue.append(neighbor)
                visited.add(neighbor)
    return None

在上述代码中,我们定义了一个节点类 Node,包含该节点的值 val 和周围节点列表 neighbors。然后,我们定义了 BFS 函数 bfs(node: Node, target: Node) -> Node,其中参数 node 是起始节点,target 是目标节点,返回值为目标节点。

在 BFS 函数内部,我们定义了一个队列 queue 和已访问节点集合 visited。首先将起始节点加入队列和已访问集合,然后开始循环遍历队列。每次从队列中取出一个节点并遍历它的周围节点,将未访问过的节点加入队列和已访问集合。

如果找到目标节点,直接返回该节点;如果队列被遍历完了仍然没有找到目标节点,说明图中不存在目标节点,返回 None