Вы можете сделать это, используя функцию рекурсивного генератора.Я предполагаю, что корневой узел в дереве всегда предшествует всем его дочерним элементам в исходном списке.
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]
Объяснение: Сначала я создаю список всех возможныхпути от каждого узла.Затем для каждого узла, который я еще не использовал, я предполагаю, что это корневой узел, и рекурсивно определяю, какие пути ведут из него.Если ни от одного узла пути не найдено, это конечный узел, и я останавливаю рекурсию и возвращаю найденный путь.
Если предположение о порядке узлов не выполняется, то сначала нужно найтинабор всех корневых узлов.Это можно сделать, найдя все узлы, которые не отображаются в качестве второго узла ни в одном соединении.