再帰ジェネレーター関数を使用してそれを行うことができます。ツリーのルートノードは、常に元のリストのすべての子の前に来ると思います。
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]
説明:最初に、各ノードからのすべての可能なパスのリストを作成します。次に、まだ使用していないノードごとに、それがルートノードであると想定し、そこからどのパスがつながるかを再帰的に見つけます。どのノードからもパスが見つからない場合、それはリーフノードであり、再帰を停止して、見つかったパスを返します。
If the assumption about the order of the nodes does not hold then you would first have to find the set of all root nodes. This can be done by finding all nodes that do not appear as the second node in any connection.