Java通用树遍历

时间:2012-04-29 12:13:02

标签: java tree traversal

我在Java中有一个问题需要解决。我有一棵树需要被遍历。这是:

        1
     /     \
   1 2 3  1 2 3      
 /   |  \    \
123 123 123  same for those three nodes

现在需要遍历的方式是从根开始,然后去最深的最左边的节点(这里是1)和最左边的叶子(1)。之后它应该从根跟踪所有数字再次开始,这次到达同一个最深的节点的下一个叶子......依此类推,即从顶部开始,每次一个接一个地到达所有剩余的叶子那个节点。在跟踪了最左边节点的所有叶子之后,它应该照常进行(从顶部开始)并且现在移动到下一个未被邀请的节点(这里是2)..等等所有树。所以前6个跟踪将是:

111 112 113 121 122 123 ......等等

需要按照上述方式按顺序跟踪和记录所有跟踪的数字。任何人都可以帮助解决如何实现它的算法?感谢。

2 个答案:

答案 0 :(得分:4)

您需要的是树遍历算法。

void traverse(Node root, String path) {
    path += root.getValue();
    for (Node child : root.getChildren())
        traverse(child, path);

    // end of current traversal
    if (root.getChildren().isEmpty())
        System.out.print(path + " ");
}

答案 1 :(得分:1)

您所描述的内容称为depth first search。你应该知道这不是最有效的工作,有更好的工作,如Dijkstra's

根据您尝试做的事情,可以采用更专业的策略,例如Alpha-Beta Pruning或其他启发式搜索游戏。

如果您已开始使用深度优先搜索并希望返回从根到该节点的路径,则可以在找到目标节点后使用以下内容。假设node是您的目标节点...

List<Node> path = new ArrayList<Node>();
path.add(node);
while(node.parent != null){
  path.add(node.parent);
  node = node.parent;
}
return path; //returns a path from {goal,...,root}