一尘不染

如何使用非递归方法实现深度优先搜索图

algorithm

我在这个问题上花了很多时间。但是,我只能找到针对树的非递归方法的解决方案:对于树是非递归的,对于图是递归的方法,对于graph是递归的

许多教程(我在这里不提供那些链接)也没有提供方法。否则该教程是完全不正确的。请帮我。

更新:

很难描述:

如果我有一个无向图:

   1
 / |  \
4  |   2
    3 /

1– 2-3 –1 是一个循环。

在步骤:“将弹出的顶点的邻居推入堆栈”中,应按什么顺序推顶点?

如果按下的顺序是243,在堆栈中的顶点是:

| |
|3|
|4|
|2|    
 _

弹出节点后,我们得到结果:1 -> 3 -> 4 -> 2而不是1--> 3 --> 2 -->4

不对 我应该添加什么条件来停止这种情况?


阅读 220

收藏
2020-07-28

共1个答案

一尘不染

没有递归的DFS与BFS基本上相同-
但使用堆栈而不是队列作为数据结构。

线程迭代DFS与递归DFS以及不同元素对这两种方法的句柄以及它们之间的区别进行排序(而且!您将不会以相同的顺序遍历节点!)

迭代方法的算法基本上是:

DFS(source):
  s <- new stack
  visited <- {} // empty set
  s.push(source)
  while (s is not empty):
    current <- s.pop()
    if (current is in visited):
        continue
    visited.add(current)
    // do something with current
    for each node v such that (current,v) is an edge:
        s.push(v)
2020-07-28