获取树的所有树路径作为字符串

时间:2013-11-19 18:49:27

标签: java recursion tree traversal subtree

我现在正在寻找一种方法,它给了我一棵树的所有路径。想象一下下面的树:

A
  B
  C
    D
      E
    F
  G

现在我希望将所有路径作为单独的String:

  • AB
  • ACDE
  • ACF
  • AG

---------------更新-----------------

正如评论中已经提到的,我正在寻找所有树路径而不是子树。 我找到了以下解决方案,但我不确定它是否会是一个好的解决方案:

  private ArrayList<ArrayList<String>> abstractProperties;

    ........

    getTreePath(abstractHw, new ArrayList<String>());

.......

    private void getTreePath(Node hw, ArrayList<String> path) {
        path.add(hw.getName());
        if (hw.getNodes().isEmpty()) {
            abstractProperties.add(path);
        } else {
               for (Node subHw : hw.Nodes()) {
                getTreePath(subHw, new ArrayList<String>(path));
               }
            }
    }

您怎么看?

3 个答案:

答案 0 :(得分:0)

您可以使用BFS算法(维基百科上解释的图算法),从您想要创建根节点开始。

算法的行为如下:

procedure BFS(G,v,btree):
      create a queue Q
      enqueue v onto Q
      mark v
      btree = new Tree(v);//Create a tree structure with v as root
      while Q is not empty:
          t ← Q.dequeue()
          btree.add(t) // Here its where you add elements to your tree
          for all edges e in G.incidentEdges(t) do
             o ← G.opposite(t,e)
             if o is not marked:
                  mark o
                  enqueue o onto Q

当Q为空时表示您处理了所有可能的节点,并且所有节点都已添加到二叉树(btree)中。

一旦你有了btree,你可以应用任何简单的算法来获得你需要的东西

答案 1 :(得分:0)

您实现树(或更准确地说,节点)需要能够返回他们是否有孩子。

如果您想要更详细的答案显示您尝试过的内容,并告诉我们您如何存储树。

答案 2 :(得分:0)

这就是我能够在任意树结构中打印叶节点的完整路径的方法:

<script>
    function factory(name, children) {
        return {
            name: name,
            children: children
        }
    }

    var paths = [];

    function getGroupPaths(node, path) {
        path.push(node.name);
        if (node.children.length == 0) {
            console.log(path.join());
        } else {
            for (child of node.children) {
                getGroupPaths(child, path);
            }
        }
        path.pop();
    }

    var acca = factory('acca', []);
    var accb = factory('accb', []);
    var accc = factory('accc', []);
    var aca = factory('aca', []);
    var acb = factory('acb', []);
    var acc = factory('acc', [acca, accb, accc]);
    var aa = factory('aa', []);
    var ab = factory('ab', []);
    var ac = factory('ac', [aca, acb, acc]);
    var ad = factory('ad', []);
    var a = factory('a', [aa, ab, ac, ad]);

    var path = [];
    getGroupPaths(a, path);
</script>

结果:

A,AA

A,AB

一个,AC,ACA

一个,AC,ACB

一个,AC,ACC,ACCA

一个,AC,ACC,ACCB

一个,AC,ACC,ACCC

一个,广告