DFS遍历迭代

时间:2014-11-20 23:19:33

标签: graph iteration traversal depth-first-search

我试图理解DFS递归和DFS迭代之间的区别。在这个问题中,邻居按字母顺序迭代。

使用DFS递归,我得到A,C,D,E,F。但是,我不理解DFS迭代遍历的过程。我的教授说使用DFS迭代方法,应该得到A E D C F.有人能引导我朝正确的方向发展吗?

以下是图片:enter image description here

2 个答案:

答案 0 :(得分:0)

对于图形,可以有多种方法使用DFS遍历节点并从同一源开始。 例如,将您的图表表示为附属列表。它可以是:

B: A
A: C, D, E
C: D, E, F
F: D

B: A
A: E, D, C
C: F, D, E
F: D

两者都是有效的陈述。 但是如果你通过按照它们出现在邻居列表中的顺序选择尾部来实现它,第一个将导致:A-> C-> D-> E-> F,而第二个将导致A - > E-> D-> C-> F。两者都是有效的遍历。

答案 1 :(得分:0)

就运行时间而言,两者大致相同。

如果有的话,使用迭代DFS应该稍微快一点,因为只要递归函数返回就不必返回堆栈帧。

要回答您的问题,递归DFS不使用堆栈,而迭代DFS则使用堆栈。因此,您的递归DFS将查看所有邻居,如果尚未找到邻居,则立即执行DFS。这就是为什么顺序是A,C,D等的原因。对于迭代DFS,它利用堆栈,因此将首先遍历最后存储的节点。由于我们按照字母顺序进行操作,因此E将最后存储,因此它将首先从A遍历。然后是D,C,依此类推。