我尝试实现以下图形 DFS 方法:
/** Performs a depth-first traversal of G over all vertices
* reachable from V. That is, the fringe is a sequence and
* vertices are added to it or removed from it at one end in
* an undefined order. After the traversal of all successors of
* a node is complete, the node itself is revisited by calling
* the postVisit method on it. */
public void depthFirstTraverse(Graph<VLabel, ELabel> G,
Graph<VLabel, ELabel>.Vertex v) {
Stack<Vertex> fringe = new Stack<Vertex>();
HashSet<Vertex> marked = new HashSet<Vertex>();
fringe.push(v);
while (!fringe.isEmpty()) {
Vertex vert = fringe.pop();
if (!marked.contains(vert)) {
marked.add(vert);
visit(vert);
for (Edge edge : G.edges(vert)) {
preVisit(edge, vert);
fringe.add(edge.getV1());
}
}
}
}
根据我的测试,我已经掌握了一般的算法,但是我仍然缺少最后一句话中的要求:“在遍历完一个节点的所有后继节点之后,通过调用 postVisit 方法重新访问该节点本身。”我不知道如何迭代地添加这个 postVisit 方法(不能更改函数签名,所以递归不可行)。有什么想法吗?