算法面试题

图遍历:BFS与DFS – 何时用哪个

请解释BFS和DFS图遍历。什么时候用哪个?

为什么面试官会问这道题

图遍历是无数算法的基础——最短路径、环检测、拓扑排序、连通分量等。面试官测试你是否理解其机制,能否为给定问题选择正确的遍历方式。

如何回答

  1. 1

    定义BFS(使用队列,逐层探索)和DFS(使用栈或递归,尽可能深入探索)。

  2. 2

    给出时间和空间复杂度:都是 O(V+E) 时间;BFS队列 O(V) 空间,DFS递归栈 O(V)。

  3. 3

    解释BFS的使用场景:无权图最短路径、层序问题。

  4. 4

    解释DFS的使用场景:环检测、拓扑排序、路径查找、解迷宫。

参考回答示例

BFS 用队列逐层探索图。从源节点开始,先访问所有邻居再进入下一层。这保证了无权图中的最短路径,适合求最少步数或最少连接数的问题。DFS 沿每条分支尽可能深入后回溯,用递归或显式栈实现。它更适合需要探索所有路径、检测环或生成拓扑排序的问题。两者时间都是 O(V+E),V 为顶点数,E 为边数。BFS 最坏空间 O(V)(最宽层),DFS 最坏空间 O(V)(最长路径)。我在最短路径和层序问题中选 BFS,在穷举搜索、环检测和拓扑排序中选 DFS。图很深时用迭代 DFS 避免栈溢出;图很宽时 DFS 更省内存。

实用技巧

  • 始终使用 visited 集合避免有环图中的无限循环。

  • 加权图最短路径用 Dijkstra(BFS+优先队列),而非普通BFS。

  • 掌握迭代DFS——面试官有时会要求将递归DFS转为迭代以避免栈溢出。

常见问题

BFS能找最短路径吗?

可以,在无权图中BFS保证最短路径,因为它逐层探索。加权图需要用 Dijkstra 或 Bellman-Ford。

什么是拓扑排序?

DAG中顶点的线性排序,使得每条有向边 u→v 中 u 都排在 v 前面。可用 DFS(逆后序)或 BFS(Kahn算法)计算。

如何检测图中的环?

有向图中用 DFS 三色标记法(白/灰/黑),回边指向灰色节点则有环。无向图中访问到已访问的非父节点即存在环。

面试时担心忘词?即答侠实时助你

即答侠 AI 实时监听面试对话,自动识别问题并即时生成回答建议——无感辅助,让你从容应对每一道题。

免费试用即答侠