打印树中的所有路径(不仅仅是节点的根)

时间:2015-01-17 18:31:58

标签: data-structures binary-tree

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

例如:

     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)。有更有效的解决方案吗?

2 个答案:

答案 0 :(得分:0)

如果您只对结果感兴趣,而不是算法,请在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)

答案 1 :(得分:0)

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

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

  2. 按值将此地图传递给每个节点。您可以使用以下功能:

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

      

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

         

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

         

    c)打印所有键,然后打印它们的值向量。

         

    d)同时将新键作为n插入到地图中,空矢量作为值。

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