Files
leetcode-go/笔试/微派 Test1/09-单选题7-图遍历.md
T

3.2 KiB
Raw Blame History

tags, create time
tags create time
笔试
微派
图
BFS
DFS
数据结构
2026-05-16 15:15

09 - 单选题 7:图的遍历(BFS vs DFS)

题目

关于无向图的广度优先搜索 (BFS) 和 深度优先搜索 (DFS),以下说法正确的是:

选项 内容
A BFS 使用栈作为辅助数据结构,DFS 使用队列作为辅助数据结构
B BFS 找到的两点间路径一定是最短路径(每条边的权重相等时)
C DFS 的空间复杂度始终优于 BFS
D BFS 不能用于检测图中的环,只有 DFS 可以
点击查看答案与解析

✅ 正确答案:B


详细解析

BFS vs DFS 核心对比

flowchart LR
    subgraph "BFS"
        Q["📋 队列 Queue"] -->|"FIFO, 先进先出"| L1["按层访问"]
    end
    
    subgraph "DFS"
        S["📚 栈 Stack / Recursion"] -->|"LIFO, 后进先出"| L2["深入到底再回溯"]
    end

逐项分析

选项 正误 原因
A ❌ 反了! BFS 用队列(Queue),DFS 用栈(Stack)。BFS 一层一层地往外扩展,队列天然适合;DFS 深入挖掘到底后回溯,栈天然适合
B ✅ 正确 在无权图(或等权图)中,BFS 按层遍历,第一次到达目标节点时的路径就是最短路径。这是 BFS 最重要的性质之一
C ❌ 不一定。最坏情况下 BFS 需要存储整层节点,空间 O(
D ❌ BFS 也能检测环! BFS 中如果发现遇到一个已访问的节点且不是当前节点的前驱,就说明存在环。虽然 DFS 判环更直观(利用递归栈的 colored 标记法),但说"只有 DFS 可以"是错的

BFS 为什么能找到最短路径?

flowchart TD
    subgraph "BFS 层层扩张"
        R["起点 S"] --> L1["第1层: A, B"]
        L1 --> L2["第2层: C, D, E"]
        L2 --> L3["第3层: F"]
    end
    
    style R fill:#a8e6cf
    style L1 fill:#ffd3b6
    style L2 fill:#ffaaa5
    style L3 fill:#ff8b94

核心证明思路: BFS 按距离 d = 0, 1, 2, ... 的顺序访问节点。假设存在一条更短的路径长度为 k < d,那么 BFS 会在第 k 层就发现目标节点,矛盾。所以首次到达时的路径必定最短。

BFS vs DFS 完整对比表

特性 BFS DFS
数据结构 队列 (Queue) 栈 (Stack) / 递归
访问顺序 逐层扩展 沿路深入到底
最短路径 ✅ 无权图中保证 ❌ 不保证
空间复杂度 O( V
能否检测环 ✅(遇到已访问的非父节点) ✅(遇到已访问且在递归栈中的节点)
适用场景 最短路径、层次遍历 拓扑排序、连通分量、路径查找
是否能找到解 ✅ 如果解靠近起点 ✅ 如果解靠近某条深路径

[!tip] 记忆技巧

  • BFS = Breadth First Search → 横向扫 → 队列 → 短路
  • DFS = Depth First Search → 纵向钻 → 栈 → 深入