Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在java中使用邻接列表实现有向图的深度优先搜索算法?_Java_Algorithm_Graph_Iterator_Depth First Search - Fatal编程技术网

如何在java中使用邻接列表实现有向图的深度优先搜索算法?

如何在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遍历将从其开始的节点。 } 我以哈希表的形式设置了后继者和

我需要帮助编写一个方法,根据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