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

Algorithm Java中深度优先搜索从源到目标路径的递归实现,algorithm,recursion,graph,path,depth-first-search,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<V

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

这是我的非递归实现代码

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;
    }
我想实现查找两个节点A和B之间的路径。 因此dfs将采用两个节点,并递归地查找节点之间的路径


谢谢

堆栈的位置。push()似乎是递归调用的自然位置。pop()可能对应于返回false作为结果

但是将递归的
dfs()
函数转换为您需要的函数可能更简单:

  • dfs()
    转换为您的目标数据结构(
    Graphnode
    ->
    Vertex
    迭代器
    等)。检查它是否与
    System.out.println()
    一起工作。这可能是最困难的部分。如果您卡在那里,请将输出张贴到此处

  • 只需添加一个
    dest
    参数,并检查节点是否匹配(在本例中,在循环后返回
    true
    ,否则返回
    false
    )。确保检查循环中递归
    dfs()
    调用的结果,如果找到元素,则返回
    true


  • 递归上的“depthFirstSearch(String name1,String name2)”是如何发生的?传递相同的name1和name2?我将把递归放在一个单独的助手方法中,该方法使用
    Vertex
    source
    dest
    参数在递归方法中。顺便问一下:为什么要执行
    dest.name.equals(source.name)
    而不仅仅是
    dest==source
    ?正确地进行dest==source身份检查..但我认为这不重要。事实上,顶点不需要正确地实现equals方法?我不知道如何实现递归?你能给出一点更具体的步骤吗?谢谢==比equals快,并且如果你想检查身份,那该做什么呢?节点是相等的是什么意思?它们不一定因为连接而相同吗?Re:更具体的步骤:我在上面的答案中添加了一些细节。
    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);
       }
    }