Вот рекурсивный метод для наведения пути к каждому листу, используя yield from
и рекурсию.
class Tree:
def __init__(self, *children, data=None):
self.data = data
self.children = children
def find_all(root, path_to=()):
if root is None:
return
if not root.children:
yield (root.data, path_to)
else:
for i, node in enumerate(root.children):
yield from find_all(node, path_to=(*path_to, i))
root = Tree(Tree(Tree(data='a'), Tree(data='b'), Tree(data='c')), Tree(Tree(data='d'), Tree(Tree(data='e'), Tree(data='f'), Tree(data='g')), Tree(data='f')), Tree(Tree(data='g'), Tree(data='h'), Tree(data='i')))
print(list(find_all(root)))
# [('a', (0, 0)), ('b', (0, 1)), ('c', (0, 2)), ('d', (1, 0)), ('e', (1, 1, 0)), ('f', (1, 1, 1)), ('g', (1, 1, 2)), ('f', (1, 2)), ('g', (2, 0)), ('h', (2, 1)), ('i', (2, 2))]