遍历一棵树 - 但是一步一步

时间:2012-05-24 05:53:59

标签: java algorithm data-structures tree traversal

我有以下代码遍历树(预订):

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)迭代?

此致 穆罕默德

3 个答案:

答案 0 :(得分:2)

您发布的算法背后的想法是使用方法堆栈作为隐式数据结构。每当你输入遍历时,所有节点都被隐式地推送到函数堆栈上,然后当你遍历它们时它们会被弹出。

现在要使此算法像迭代器一样可挂起,您需要做的就是使这个隐式堆栈显式化。在访问推送所有子项时,向您的类添加一个堆栈,然后始终使用堆栈上的顶级节点继续。您可以随时暂停此操作,同时将堆栈保持为可以暂停和存储在任何位置的状态。

这个技巧实际上适用于任何类型的递归算法。

答案 1 :(得分:0)

如果您的代码collectNodes(child)会出错,您是不是认为最后一行,因为collectNodes()方法会接受两个参数。

答案 2 :(得分:-1)

您可以使用迭代器逐步找到树遍历的代码here

希望这会对你有所帮助。