如何在java中使用邻接列表实现有向图的深度优先搜索算法?
我需要帮助编写一个方法,根据DFS遍历中遇到的节点的顺序,在图中的所有节点上返回一个迭代器。该方法需要使用堆栈,而不是递归的如何在java中使用邻接列表实现有向图的深度优先搜索算法?,java,algorithm,graph,iterator,depth-first-search,Java,Algorithm,Graph,Iterator,Depth First Search,我需要帮助编写一个方法,根据DFS遍历中遇到的节点的顺序,在图中的所有节点上返回一个迭代器。该方法需要使用堆栈,而不是递归的 Iterator<T> dfsNodeListing(T start){ //Where start is the node that the dfs traversal will begin from. } 迭代器dfsNodeListing(T start){ //其中start是dfs遍历将从其开始的节点。 } 我以哈希表的形式设置了后继者和
Iterator<T> dfsNodeListing(T start){
//Where start is the node that the dfs traversal will begin from.
}
迭代器dfsNodeListing(T start){
//其中start是dfs遍历将从其开始的节点。
}
我以哈希表的形式设置了后继者和前继者,以跟踪进出每个节点的边。我还有一个ArrayList,如果搜索访问了某个节点,则会将其添加到该ArrayList中
private Hashtable <T, Set<T>> pred = new Hashtable<>();
private Hashtable <T, Set<T>> succ = new Hashtable<>();
private ArrayList<T> mark = new ArrayList <>();
private Hashtable pred=new Hashtable();
私有哈希表succ=新哈希表();
private ArrayList mark=new ArrayList();
如何将所有这些要素结合在一起
编辑:这是我目前正在处理的问题。我被困在中间的某个地方,方法永远不会完成。
public Iterator<T> dfsNodeListing(T start) {
Stack<T> stk = new Stack<>();
stk.push(start);
if(!mark.contains(start)){
mark.add(start);
stk.push(start);
while(!stk.isEmpty()){
stk.pop();
for(T n : succ.get(start)){
if(!mark.contains(n)){
stk.push(n);
}
}
}
}
return mark.iterator();
}
公共迭代器dfsNodeListing(T start){
堆栈stk=新堆栈();
stk.push(启动);
如果(!mark.contains(开始)){
标记。添加(开始);
stk.push(启动);
而(!stk.isEmpty()){
stk.pop();
for(tn:succ.get(start)){
如果(!标记包含(n)){
stk.push(n);
}
}
}
}
返回mark.iterator();
}
我认为您的foreach
循环有问题,因为您只获得start
节点的后续节点,而不是从堆栈中弹出的节点。您可以修改代码,如下所示:
while(!stk.isEmpty()){
for(T n : succ.get(stk.pop())){
if(!mark.contains(n)){
stk.push(n);
mark.add(n);
}
}
}
你能提供一个迄今为止你所尝试的例子吗?或者提供一个递归解决方案并请求帮助使其非递归?作为旁注,
HashTable
是一个同步类。通常我们使用HashMap
。