广度优先搜索算法已使用队列数据结构实现。访问下图的节点的一种可能顺序是
(A) MNOPQR
(B) NQMPOR
(C) QMNPRO
(D) QMNPOR答案: (C)
说明:广度优先搜索首先访问“宽度”,即,如果它正在访问一个节点,则在访问该节点之后,它将首先访问邻居节点(子节点),然后再移动到下一级邻居。
让我们看看如何。
最初:如果BFS从节点Q开始,它将首先访问Q并将Q放入队列。
因此,队列包含:Q。
而且,访问顺序仍然是:问。
现在,它使Q出队,并探索其邻居{M,N,P}。它检查尚未访问的Q邻居,然后访问它们,并将它们放入Queue(以便以后可以访问其邻居)。
现在,可以访问这些邻居并将它们按任何顺序放入Queue(取决于实现)。
假设它访问并将它们按顺序(MNP)放入队列,M在FRONT上,P在REAR上。
因此,访问顺序:QMNP。
现在,它将在队列中查找下一个条目。当队列遵循FIFO原则时,M出队。
队列包含:(NP)
它探索M,找到其邻居{N,Q,R},但是在访问它们之前,它会检查它们是否已被更早访问,它将仅访问并将那些尚未访问的节点放入队列。由于N和Q较早被访问过,因此只会访问R并将其排队。
来访顺序:QMNPR。
队列包含:(NPR)。
现在,N出队了。
队列包含:(PR)。
它探索N,找到其邻居{M,O,Q}。由于M和Q较早被访问过,因此只会访问O并使其入队。
访问订单:QMNPRO。
队列包含:(PRO)。
现在,P出队了。
队列包含:(RO)。
它探索P,找到其邻居{O,Q}。由于O和Q较早被访问过,因此不会排队。
现在,R出队了。
队列包含:(O)。
它探索R,找到其邻居{M}。由于M较早曾被访问过,因此不会排队。
现在,O出队了。
队列包含:()。
它探索O,找到其邻居{N,P}。由于两者都已被访问过,所以它不会进入队列。
现在,队列为空,因此BFS在此处停止。
且访问顺序为:QMNPRO。
可以在以下网址找到上述说明的伪代码:https://en.wikipedia.org/wiki/Breadth-first_search
这个问题的测验