【问题标题】:Java Generic Tree TraversalJava 泛型树遍历
【发布时间】:2012-04-29 12:13:01
【问题描述】:

我有一个问题需要用 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 ...等等

所有被追踪的号码都需要按上述方式依次追踪和记录。任何人都可以帮助解决如何实现它的算法?谢谢。

【问题讨论】:

    标签: java tree traversal


    【解决方案1】:

    你需要的是一个树遍历算法。

    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 + " ");
    }
    

    【讨论】:

      【解决方案2】:

      您所描述的是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}
      

      【讨论】:

      • @unbeli 是的,你是对的 .. 与搜索毫无关系 .. 到目前为止,尽管没有人提出如何做到这一点的想法 ..
      猜你喜欢
      • 2014-08-16
      • 1970-01-01
      • 1970-01-01
      • 2014-05-26
      • 1970-01-01
      • 1970-01-01
      • 2013-02-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多