我有这个工作代码,用于非递归地查找源到目标之间的路径。 我想以递归方式实现,但我在如何做到这一点上有困难。
这是我的非递归实现代码
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会占用两个节点并在递归之间找到路径。
由于
答案 0 :(得分:1)
你执行stack.push()的地方似乎是递归调用的自然场所。 pop()应该对应于返回false作为结果。
但也许将递归dfs()
函数转换为您需要的函数更直接:
将dfs()
转换为目标数据结构(Graphnode
- &gt; Vertex
,Iterator
... - &gt; while(adjacentUnvisitedVertex(...)
等。 )。检查它是否适用于System.out.println()
。这可能是最难的部分。如果你遇到困难,请在此处发布输出。
只需添加dest
参数并检查节点是否匹配(在这种情况下返回true
,否则返回false
)。确保在循环中检查递归dfs()
调用的结果,如果找到元素,则返回true
。