Это пример ввода:
0
/ \
1 2
/ \ /|\
3 4 5 6 7
Подумайте, что вы хотите, чтобы (рекурсивная) функция возвращала для каждого из узлов:
- при вызове в корне(0), он должен возвращать полный результат (3, 4, 5, 6, 7)
- при вызове на листовом узле (например, 5), он должен возвращать этот узел (5)
- для любого другого узла (например, 1), он делает так, как если бы это был корневой узел меньшего дерева
Итак, иногда он возвращает один результат, а иногда и много.Ошибка в вашем коде здесь, потому что функция заканчивается при первом возврате, она не возвращает много:
for i in self.children:
return i.find2()
Есть два решения:
- сделать функцию генератораили
- сделать функцию, которая возвращает список (сделать так, чтобы он возвращал список всегда, даже если в нем только один элемент!)
Итак, вариант 1:
def find(self):
if not hasattr(self, 'children'):
yield self
else:
for child in self.children:
yield from child.find()
вариант 2:
def find(self):
if not hasattr(self, 'children'):
return [self]
else:
rtn = []
for child in self.children:
for result in child.find():
rtn.append(result)
return rtn
Я предпочитаю генератор.Кроме того, мне не особенно нравится тот факт, что некоторые из ваших узлов имеют атрибут children
, а другие нет.Я бы удостоверился, что у всех них было children
, которое могло быть пустым или непустым.Затем код становится:
def find_leaves(self):
if self.children:
for child in self.children:
yield from child.find_leaves()
else:
yield self