那么如何打印树中的所有路径。这里的条件是我们不仅希望从子树中的根路径开始路径。
例如:
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)。有更有效的解决方案吗?
答案 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)
假设您的树有不同的节点,您可以:
创建一个地图,其键为int,值为vector。键代表您遇到的每个节点,vector用于存储您将在节点下遍历的所有节点。
按值将此地图传递给每个节点。您可以使用以下功能:
void printAllPaths(node *proot, map<int, vector<int> > m)
每当遇到新节点n时,请执行以下操作
a)对于每组k中的每个k
b)将n加到k的值向量中。
c)打印所有键,然后打印它们的值向量。
d)同时将新键作为n插入到地图中,空矢量作为值。
注意:如果您的树有重复的节点,那么多图表将帮助您跟踪。在这种情况下,c ++ STL将很好地为您服务。