递归实现深度优先搜索以查找Java中从源到目标的路径

时间:2013-11-19 23:46:38

标签: algorithm recursion graph path depth-first-search

我有这个工作代码,用于非递归地查找源到目标之间的路径。 我想以递归方式实现,但我在如何做到这一点上有困难。

这是我的非递归实现代码

public boolean depthFirstSearch(String name1, String name2){
        Vertex source = vertexMap.get(name1);
        Vertex dest = vertexMap.get(name2);
        clearAll();

        Stack<Vertex> stack = new Stack<Vertex>();
        source.setVisited(true);
        stack.push(source);

        while(!stack.isEmpty()){
            source = stack.peek();
            System.out.println(source.name);
            if (dest.name.equals(source.name))
                return true;
            Vertex v = adjacentUnvisitedVertex(source);
            if (v!=null){
                v.setVisited(true);
                v.prev=source;
                stack.push(v);
            }
            else stack.pop();   
        }
        if (!source.name.equals(dest.name)){
            System.out.println("destination cannot be reached");
            return true;
        }
        else return false;
    }

    private Vertex adjacentUnvisitedVertex(Vertex v){

        for (Edge e : v.adj){
            if (!e.target.isVisited){
                return e.target;
            }
        }

       return null;
    }

虽然这里有一个简单的DFS递归实现,但它访问所有节点:

static void dfs (Graphnode n) {
   n.setVisited( true );
   Iterator it = n.getSuccessors().iterator();
   while (it.hasNext()) {
      Graphnode m = (Graphnode)it.next();
      if (! m.getVisited()) dfs(m);
   }
}

我想实现在两个节点A和B之间寻找路径。 所以dfs会占用两个节点并在递归之间找到路径。

由于

1 个答案:

答案 0 :(得分:1)

你执行stack.push()的地方似乎是递归调用的自然场所。 pop()应该对应于返回false作为结果。

但也许将递归dfs()函数转换为您需要的函数更直接:

  1. dfs()转换为目标数据结构(Graphnode - &gt; VertexIterator ... - &gt; while(adjacentUnvisitedVertex(...)等。 )。检查它是否适用于System.out.println()。这可能是最难的部分。如果你遇到困难,请在此处发布输出。

  2. 只需添加dest参数并检查节点是否匹配(在这种情况下返回true,否则返回false)。确保在循环中检查递归dfs()调用的结果,如果找到元素,则返回true