Logo

深度优先搜索和广度优先搜索

广度优先搜索

基于图的广度优先搜索

BFS 通常借助队列来实现,代码如下所示。队列具有“先入先出”的性质,这与 BFS 的“由近及远”的思想异曲同工。

  1. 将遍历起始顶点 startVet 加入队列,并开启循环。
  2. 在循环的每轮迭代中,弹出队首顶点并记录访问,然后将该顶点的所有邻接顶点加入到队列尾部。
  3. 循环步骤 2. ,直到所有顶点被访问完毕后结束。 为了防止重复遍历顶点,我们需要借助一个哈希集合 visited 来记录哪些节点已被访问。
/*广度优先遍历*/
//使用邻接表来表示图,以便获取指定顶点相邻的顶点
vector<Vertex *> graphBFS(GraphAdjustList & graph, Vertex *startVet){
	//顶点遍历序列
	 vector<Vertex *> res;
    // 哈希集合,用于记录已被访问过的顶点
    unordered_set<Vertex *> visited = {startVet};
    // 队列用于实现 BFS
    queue<Vertex *> que;
    que.push(startVet);
    // 以顶点 vet 为起点,循环直至访问完所有顶点
    while (!que.empty()) {
        Vertex *vet = que.front();
        que.pop();          // 队首顶点出队
        res.push_back(vet); // 记录访问顶点
        // 遍历该顶点的所有邻接顶点
        for (auto adjVet : graph.adjList[vet]) {
            if (visited.count(adjVet))
                continue;            // 跳过已被访问的顶点
            que.push(adjVet);        // 只入队未访问的顶点
            visited.emplace(adjVet); // 标记该顶点已被访问
        }
    }
    // 返回顶点遍历序列
    return res;
}

可视化理解 广度优先搜索

基于树的广度优先算法

树的算法部分#树的算法部分

© 2025 All rights reservedBuilt with Flowershow Cloud

Built with LogoFlowershow Cloud