【发布时间】:2014-02-02 08:58:36
【问题描述】:
我在这个问题上花了很多时间。但是,我只能找到对树使用非递归方法的解决方案:Non recursive for tree,或者为图形找到递归方法,Recursive for graph。
而且很多教程(我在这里不提供这些链接)也没有提供方法。或者教程完全不正确。请帮帮我。
更新:
真的很难形容:
如果我有一个无向图:
1
/ | \
4 | 2
3 /
1-- 2-- 3 --1是一个循环。
在步骤:'将弹出的顶点的邻居推入堆栈'时,顶点应该被推入的顺序是什么?
如果推送顺序为2、4、3,则栈中的顶点为:
| |
|3|
|4|
|2|
_
弹出节点后,我们得到结果:1 -> 3 -> 4 -> 2 而不是1--> 3 --> 2 -->4。
这是不正确的。我应该添加什么条件来停止这种情况?
【问题讨论】:
-
使用@amit 的优秀答案中的算法,我无法让 4 出现在 3 和 2 之间。算法中有一个重要的细节。仅在实际访问节点时才将节点添加到访问集中,而不是在将其压入堆栈时。在堆栈推送上将其标记为已访问会导致您遇到的问题,因为它会阻止将 3 视为 2 的子项,或将 2 视为 3 的子项。
标签: algorithm graph depth-first-search non-recursive