我在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 ......等等
需要按照上述方式按顺序跟踪和记录所有跟踪的数字。任何人都可以帮助解决如何实现它的算法?感谢。
答案 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}