【问题标题】:Get all treepaths of a Tree as String以字符串形式获取树的所有树路径
【发布时间】:2013-11-19 18:49:27
【问题描述】:

我现在正在寻找一种方法,该方法为我提供了给定树的所有路径。想象一下下面的树:

A
  B
  C
    D
      E
    F
  G

现在我想将所有路径作为单独的字符串:

  • AB
  • ACDE
  • ACF
  • AG

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

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

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

你怎么看?

【问题讨论】:

  • @ZongZhengLi 这真的不是重复的。 ph09:你对树有什么表示?
  • 不,根本不是那个问题的重复。
  • @Cruncher 是的,不再是(在海德的编辑之后)。最初,“树”被指定为“A B C D E F G”。
  • “子树”到底是什么意思?从您的示例中,您的意思似乎是从根到叶子的每条路径。如果这是您的意思,那么这与遍历所有叶节点(以任何有意义的顺序)并输出到该叶的完整路径相同。如果这不是您想要的,请澄清问题。

标签: java recursion tree traversal subtree


【解决方案1】:

您可以使用 BFS 算法(Wikipedia 上解释的图形算法),从您要创建根的节点开始。

算法的行为如下:

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,你就可以应用任何简单的算法来获得你需要的东西

【讨论】:

  • 就个人而言,如果你不是在寻找尽可能浅的东西,我会使用 DFS en.wikipedia.org/wiki/Depth-first_search
  • 我没有二叉树,所以我认为这对我不起作用
  • btree 不是二叉树的缩写,但我更喜欢 Btree。
【解决方案2】:

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

如果您想要更详细的答案,请展示您尝试过的内容并向我们展示您是如何存储您的树的。

【讨论】:

  • 我提供了一个代码示例..也许你可以告诉我你的想法
  • @ph09 是 Node 您自己的类还是来自 java 包?
  • 这是我的课..只是作为一个例子
【解决方案3】:

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

<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

a,ac,aca

a,ac,acb

a,ac,acc,acca

a,ac,acc,accb

a,ac,acc,accc

一个广告

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-23
    • 2018-05-02
    • 1970-01-01
    • 1970-01-01
    • 2015-04-14
    • 1970-01-01
    • 2017-11-29
    相关资源
    最近更新 更多