所以我最近实现了一个非递归版本的DFS。事实证明,只要它们被推入堆栈或弹出它们,我就可以将节点标记为“已访问”。我正在努力解决的问题是在堆叠时将其标记为“已访问”。这两个版本都是某种DFS。或者它是一个是DFS而另一个不是。欢迎任何建议。
我认为如果我采用第二种方式,它将模仿递归dfs。但为什么另一个有效?
递归dfs(请忽略此)
dfsRec(node)
{
visitedArray[node]=1;
for all neighbours of node
if they aren't visited
dfsRec(neighbour);
}
dfs(startNode)
{
visitedArray;
dfsRec(startNode);
}
答案 0 :(得分:3)
第二种方式的问题(即标记弹出时访问的节点)是,只要图形有一个循环,你的代码就会永远循环。一旦DFS到达该周期,它将继续循环,因为节点在被弹出堆栈之前不会被标记为访问,因此可以一次又一次地推送通过一个循环可到达的任何节点,直到你的内存不足。
请注意,问题与DFS的递归实现没有太大区别:递归实现会导致堆栈溢出而不是耗尽内存,但其原因是相同的。