图遍历是无数算法的基础——最短路径、环检测、拓扑排序、连通分量等。面试官测试你是否理解其机制,能否为给定问题选择正确的遍历方式。
定义BFS(使用队列,逐层探索)和DFS(使用栈或递归,尽可能深入探索)。
给出时间和空间复杂度:都是 O(V+E) 时间;BFS队列 O(V) 空间,DFS递归栈 O(V)。
解释BFS的使用场景:无权图最短路径、层序问题。
解释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保证最短路径,因为它逐层探索。加权图需要用 Dijkstra 或 Bellman-Ford。
DAG中顶点的线性排序,使得每条有向边 u→v 中 u 都排在 v 前面。可用 DFS(逆后序)或 BFS(Kahn算法)计算。
有向图中用 DFS 三色标记法(白/灰/黑),回边指向灰色节点则有环。无向图中访问到已访问的非父节点即存在环。