Skip to content

2013年 408 数据结构 第 8 题

数据结构2013年选择题2分

题目

若对如下无向图进行遍历,则下列选项中,不是广度优先遍历序列的是()

abecdfgh

错因

A

误以为 BFS 必须从 a 开始("图的第一个节点"),看到 h 起点就直接判错。但题目没规定起点——任意顶点都可以作为 BFS 起点。从 h 出发:先访 h,h 的邻居 {a, c}(顺序 c 先 a 后),逐层展开完全合法。

B

同理,误以为不能从 e 起点;或者觉得 b、h、c、d 在末尾的顺序"很乱"。其实从 e 起,e 邻居 {a, f, g},第二层从 a 拓展出 b、h,再后从 b 拓展出 c、d,全程符合 BFS 分层原则。

C

误判 d 起点不合法。从 d 起,邻居 {b, c},再依次展开 a、h,最后拿到 e 之后才到 f、g,逐层推进无破绽。其实最容易识别 BFS 合法性的方法是:看每个节点的所有未访问邻居是否都在它之后、它的"邻居的邻居"之前出现——C 完全满足。

总解析

邻接表(从图中读出):

顶点邻居
ab, e, h
ba, c, d
cb, d, h
db, c
ea, f, g
fe
ge
ha, c

BFS 合法性的核心约束

设访问序列为 ,则 的所有未访问邻居都必须在 早于" 邻居的邻居"出现。
等价表述:BFS 严格按"层序"展开——源点的邻居必须先全部访问完,才能开始访问邻居的邻居。

逐项验证

A:h, c, a, b, d, e, g, f

从 h 出发:访 h → 队列 {a, c}(按邻居顺序入队)。
取 c → 访 c → c 的新邻居 {b, d}(h 已访)→ 队列 {a, b, d}。
取 a → 访 a → a 的新邻居 {b(已在队), e, h(已访)} → 实际入队 {e},队列 {b, d, e}。
依次取 b、d → 无新邻居 → 取 e → 访 e → e 的新邻居 {g, f}(顺序自由)→ 末尾 g, f。

B:e, a, f, g, b, h, c, d

从 e:访 e → 队列 {a, f, g}。取 a → a 新邻居 {b, h},入队 {f, g, b, h}。取 f、g → 无新;取 b → b 新邻居 {c, d},入队 {h, c, d}。取 h → 无新;取 c、d。

C:d, b, c, a, h, e, f, g

从 d:队列 {b, c}。取 b → 新邻居 {a},入队 {c, a}。取 c → 新邻居 {h},入队 {a, h}。取 a → 新邻居 {e},入队 {h, e}。取 h → 无新;取 e → 新邻居 {f, g}。

D:a, b, c, d, h, e, f, g不合法

从 a:访 a → a 的邻居是 {b, e, h},无论入队顺序如何,b、e、h 三个节点必须先全部出现,才能轮到它们的邻居(c、d、f、g)。

但 D 序列是 a, b, c, d, h, e, f, g——c 和 d(b 的邻居)在 e、h(a 的邻居)之前就被访问了,违反了"先访问完源点的所有邻居" 这一硬规则。

直觉对照:从 a 出发的合法 BFS 第二层只能是 {b, e, h} 的某个排列,第三层才轮到 {c, d, f, g}。D 把"a 的邻居 e、h"延后到 c、d 之后,等于用了 DFS 的思路——沿着 b → c、d 一路深挖,这是 DFS 不是 BFS。

最终答案是 D

最后更新:

🎬 可视化演示
加载中...

提示:可在可视化区直接操作播放、步进、修改参数