我有以下代码遍历树(预订):
public void traverse(Node node) {
visit(node);
for (Node child : node.getChildren()) {
traverse(child);
}
}
我希望有一步一步的遍历。像Iterator
这样的东西,以便可以成为另一个应用程序的客户端(调用者)可以控制遍历。 (例如:在UI中我们有一个“下一步”按钮,点击此按钮,我们必须访问下一个节点)
我目前的解决方案是这样的:
List<Node> nodes = new ArrayList<Node>();
collectNodes(root, nodes);
Iterator<Node> it = nodes.iterator();
// do my job.
...
public void collectNodes(Node node, List<Node> nodes) {
nodes.add(node);
for (Node child : node.getChildren()) {
collectNodes(child, nodes);
}
}
正如您在代码中看到的那样,我正在访问所有节点(在collectNodes中)以收集并以预订格式将它们放入List中。
我想知道是否有任何解决方案没有这个额外的(collectNodes)迭代?
此致 穆罕默德
答案 0 :(得分:2)
您发布的算法背后的想法是使用方法堆栈作为隐式数据结构。每当你输入遍历时,所有节点都被隐式地推送到函数堆栈上,然后当你遍历它们时它们会被弹出。
现在要使此算法像迭代器一样可挂起,您需要做的就是使这个隐式堆栈显式化。在访问推送所有子项时,向您的类添加一个堆栈,然后始终使用堆栈上的顶级节点继续。您可以随时暂停此操作,同时将堆栈保持为可以暂停和存储在任何位置的状态。
这个技巧实际上适用于任何类型的递归算法。
答案 1 :(得分:0)
如果您的代码collectNodes(child)
会出错,您是不是认为最后一行,因为collectNodes()
方法会接受两个参数。
答案 2 :(得分:-1)
您可以使用迭代器逐步找到树遍历的代码here
希望这会对你有所帮助。