Вы можете рекурсивно пройти по ребрам, предполагая, что predecessor_map
является узлом отображения dict
на родительский узел и что None
является корнем:
predecessor_map={0: None, 1: None, 2: 1, 3: 1, 4: 0, 5: 1}
Определите рекурсивную функцию, которая проходит по дереву вреверс:
def path(node, predecessors):
return [None] if node is None else [node] + path(predecessors.get(node), predecessors)
Или, если хотите, комбинатор Y:
Y=lambda f: (lambda x: f(lambda *args: x(x)(*args)))(lambda x: f(lambda *args: x(x)(*args)))
path=Y(lambda f: lambda node, p: [None] if node is None else [node] + f(p.get(node), p))
Используется (с использованием списка):
>>> print [node for node in path(None, predecessor_map)]
[None]
>>> print [node for node in path(0, predecessor_map)]
[0, None]
>>> print [node for node in path(1, predecessor_map)]
[1, None]
>>> print [node for node in path(2, predecessor_map)]
[2, 1, None]
>>> print [node for node in path(3, predecessor_map)]
[3, 1, None]
>>> print [node for node in path(4, predecessor_map)]
[4, 0, None]
>>> print [node for node in path(5, predecessor_map)]
[5, 1, None]