非递归 DFS 与 BFS,仅在堆栈与队列方面有所不同?

Posted

技术标签:

【中文标题】非递归 DFS 与 BFS,仅在堆栈与队列方面有所不同?【英文标题】:Non-recursive DFS vs BFS, only differ in stack vs queue? 【发布时间】:2015-05-06 21:21:58 【问题描述】:

我正在查看一般图表的non-recursive DFS 和BFS。除了前者使用堆栈而不是队列这一事实之外,唯一的区别是它“延迟检查是否已发现顶点,直到顶点从堆栈中弹出,而不是在推送顶点之前进行检查”。为什么这个“访问”检查顺序不同?或者换一种说法,我们可以通过简单地将BFS中的队列替换为堆栈来将BFS更改为非递归DFS吗?

我检查了我能找到的所有帖子,例如 this 和 this,但没有一个可以澄清这个问题。

【问题讨论】:

【参考方案1】:

是的,这是唯一的区别。

您从***显示的 DFS 算法有一个错误(嗯,至少是严重的低效率)——它会重新插入到已经访问过的 S 节点中。 BFS 的设计更加合理,您可以将其更改为具有堆栈。

【讨论】:

仔细检查一下。所以如果我用堆栈替换 BFS 中的队列,我有一个非递归的 DFS?

以上是关于非递归 DFS 与 BFS,仅在堆栈与队列方面有所不同?的主要内容,如果未能解决你的问题,请参考以下文章

对比dfs与bfs的存储机制以及bfs与队列的关系

深度优先(DFS)与广度优先搜索(BFS)递归版与非递归版

BFS与DFS俩种搜索对比分析

迷宫算法(DFS)

DFS与BFS

(转)BFS与DFS