您可以使用递归生成器函数来做到这一点。我假设树中的根节点总是在原始列表中的所有子节点之前。
tree = [[0, 1], [1, 2], [2, 3], [2, 4], [2, 5], [5, 6], [4, 6], [3, 6],
[0, 7], [7, 6], [8, 9], [9, 6]]
paths = {}
for t in tree:
if t[0] not in paths: paths[t[0]] = []
paths[t[0]].append(tuple(t))
used = set()
def get_paths(node):
if node[1] in paths:
for next_node in paths[node[1]]:
used.add(next_node)
for path in get_paths(next_node):
yield [node[0]] + path
else:
yield [node[0], node[1]]
for node in tree:
if tuple(node) in used: continue
for path in get_paths(node):
print path
输出:
[0, 1, 2, 3, 6]
[0, 1, 2, 4, 6]
[0, 1, 2, 5, 6]
[0, 7, 6]
[8, 9, 6]
说明:首先,我从每个节点构造一个所有可能路径的列表。然后对于我还没有使用过的每个节点,我假设它是一个根节点并递归地找到从它引出的路径。如果没有从任何节点找到路径,则它是叶节点,我停止递归并返回找到的路径。
如果关于节点顺序的假设不成立,那么您首先必须找到所有根节点的集合。这可以通过查找在任何连接中不作为第二个节点出现的所有节点来完成。