如何使用 java 中的邻接表为有向图实现深度优先搜索算法?
How do I implement a depth first search algorithm for a directed graph using an adjacency list in java?
我需要帮助编写一个方法,该方法 returns 根据在 DFS 遍历中遇到的顺序遍历图中所有节点的迭代器。该方法需要使用堆栈而不是递归。
Iterator<T> dfsNodeListing(T start){
//Where start is the node that the dfs traversal will begin from.
}
我以哈希表的形式设置了后继者和前任者,以跟踪进出每个节点的边。我还有一个 ArrayList,如果搜索访问了节点,它就会被添加到该节点。
private Hashtable <T, Set<T>> pred = new Hashtable<>();
private Hashtable <T, Set<T>> succ = new Hashtable<>();
private ArrayList<T> 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();
}
我认为您的 foreach
循环有问题,因为您只能获得 start
节点的后继节点,而不是从堆栈中弹出的节点。您可以像这样修改您的代码:
while(!stk.isEmpty()){
for(T n : succ.get(stk.pop())){
if(!mark.contains(n)){
stk.push(n);
mark.add(n);
}
}
}
我需要帮助编写一个方法,该方法 returns 根据在 DFS 遍历中遇到的顺序遍历图中所有节点的迭代器。该方法需要使用堆栈而不是递归。
Iterator<T> dfsNodeListing(T start){
//Where start is the node that the dfs traversal will begin from.
}
我以哈希表的形式设置了后继者和前任者,以跟踪进出每个节点的边。我还有一个 ArrayList,如果搜索访问了节点,它就会被添加到该节点。
private Hashtable <T, Set<T>> pred = new Hashtable<>();
private Hashtable <T, Set<T>> succ = new Hashtable<>();
private ArrayList<T> 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();
}
我认为您的 foreach
循环有问题,因为您只能获得 start
节点的后继节点,而不是从堆栈中弹出的节点。您可以像这样修改您的代码:
while(!stk.isEmpty()){
for(T n : succ.get(stk.pop())){
if(!mark.contains(n)){
stk.push(n);
mark.add(n);
}
}
}