深度优先搜索(DFS)和 BFS 是兄弟算法——只把队列换成栈就成了 DFS。区别在视觉上很直观:DFS 顺着一条路一头扎到底,撞墙了才回溯到上一个岔路口换方向。
和 BFS 比
| BFS | DFS | |
|---|---|---|
| 容器 | 队列(先进先出) | 栈(后进先出) |
| 扩散形状 | 同心圆波纹 | 蛇形细线 |
| 路径 | 最短 | 找到一条就停(不一定最短) |
| 内存 | O(宽度) | O(深度) |
工作方式
- 从起点开始,把它压入栈
- 反复取栈顶的格子,朝一个未访问的方向走一步——压栈
- 如果当前格子没有未访问的方向了,弹栈(回溯)
- 直到找到终点或栈空
复杂度
- 时间:O(V + E)
- 空间:O(V) 最差(链状深度)
在动画里看什么
- 蛇形渐变色:访问顺序,能清楚看到 DFS 一头扎到底的形状
- 深蓝脉冲边框:当前调用栈(从起点到正在探索的格子的整条路径)
- 回溯那一刻:栈顶弹出,脉冲边框收缩
- 暖红路径:找到终点后的连线(注意:未必是最短的)
试一下
清空所有墙再运行一次——你会看到 DFS 直接顺着第一个方向(右)跑到底,撞到右边界再回溯。给中间加几道墙挡一挡,能看到它在迷宫里”摸着墙走”的特征。