【问题标题】:Print all paths in a tree (Not just root to nodes)打印树中的所有路径(不仅仅是根到节点)
【发布时间】:2015-01-17 18:31:57
【问题描述】:

那么您将如何打印树中的所有路径。这里的条件是我们不仅想要从根开始的路径或子树中的路径。

例如:

     2
    / \
   8   10
  /\   /
 5  6 11

所以程序应该返回:

2-8
2-10
2-8-5
2-8-6
8-5
8-6
2-10-11
10-11
5-8-2-10-11
5-8-2-10
and so on...

一种方法是在每对不同的节点之间找到 LCA,然后打印从 LCA 到两个节点的路径(在左子树中反向,在右子树中按顺序)。但是这里的复杂性是 O(n^3)。有没有更有效的解决方案?

【问题讨论】:

  • 假设它是一棵二叉树。

标签: data-structures binary-tree


【解决方案1】:

如果你只对结果感兴趣,而不是对算法感兴趣,请在 neo4j 中创建节点和关系

merge (n2:node{n:2})-[:down]->(n8:node{n:8})-[:down]->(:node{n:5})
merge (n2)-[:down]->(:node{n:10})-[:down]->(:node{n:11})
merge (n8)-[:down]->(:node{n:6})

然后查询

match p=(a)-[r:down *]-(b) return nodes(p)

【讨论】:

    【解决方案2】:

    假设你的树有不同的节点,你可以:

    1. 创建一个映射,其键为 int,值为向量。键代表您遇到的每个节点,向量用于存储您将在该节点下遍历的所有节点。

    2. 将此映射按值传递给每个节点。你可以有这样的功能:

      void printAllPaths(node *proot, map<int, vector<int> > m)
      
    3. 每当遇到新节点n时,执行以下操作

      a) 对于一组键中的每个 k

      b) 将 n 添加到 k 的值向量中。

      c) 打印所有键及其值向量。

      d) 还将新键作为 n 插入到映射中,并将空向量作为值。

    注意:如果您的树有重复的节点,则多图将帮助您跟踪。在这种情况下,c++ STL 将很好地为您服务。

    【讨论】:

    • 您建议采用哪种遍历方式,上述方法可行?复杂性?
    • 我认为这只会给出从父母到兄弟姐妹的路径,而不是从兄弟姐妹到其他兄弟姐妹的路径
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多