Вы хотите иметь путь root для каждого конечного узла. Просто используйте PreOrderIter с filter_
, чтобы получить конечные узлы:
print(list(PreOrderIter(f, filter_=lambda node: node.is_leaf)))
[a, c, e, h]
, а затем получите доступ к атрибуту path на каждом узле:
print([list(leaf.path) for leaf in PreOrderIter(f, filter_=lambda node: node.is_leaf)])
[[f,b,a], [f,b,d,c], [f,b,d,e], [f,g,i,h]]
Если вы хотите иметь путь от любого узла в дереве к узлам листа:
def allpaths(start):
skip = len(start.path) - 1
return [leaf.path[skip:] for leaf in PreOrderIter(start, filter_=lambda node: node.is_leaf)]
print(allpaths(b))
[(b, a), (b, d, c), (b, d, e)]
Обратите внимание, что есть также Walker , который обслуживает путь от любого узла до другого.