Python - Итерационное дерево с генератором в глубине-первом порядке

63
7

Я пытаюсь сделать DFS на двоичном дереве. Дерево действительно. Сама функция работает, когда выход заменяется печатью (если он не является генератором).

class BinaryTree(object):
def __init__(self, root):
self.root = root

def dfs(self):
print "Depth First"
return self.depth(self.root)

def depth(self, Node):
print "Starts"
yield Node
if Node.left != None:
print "keep it up left"
self.depth(Node.left)
if Node.right != None:
print "keep it up right"
self.depth(Node.right)
print "oh no"

Изменение: выдержка из основного:

tree = BinaryTree(15) #adds the key 15 as the root
tree.addKey(10) #adds additional entries
...
tree.addKey(5)
depthFirstSearch = tree.dfs()
for i in range(8):
print depthFirstSearch.next()
print "outside of fnc"

Для полноты дерева выглядит так:

{15: {10: {3: {2: , }, {5: , }}, }, {17: , {60: {23: , }, }}}

Результат выглядит следующим образом:

Depth First
Starts
15
outside of fnc
keep it up left
keep it up right
oh no

Таким образом, из-за строк отладки "keep it up" узлы есть. Тем не менее, похоже, что он пропущен прямо над этапом рекурсии. В противном случае он снова напечатает Start. Я попытался заменить добавление урожая в self.depth(Node.right), но это ничего не помогает. Операторы возврата не являются хорошими внутри генератора, что имеет смысл для меня. Благодарю!

спросил(а) 2021-01-25T16:08:02+03:00 4 месяца, 4 недели назад
1
Решение
88

Внутри BinaryTree.depth вы возвращаетесь, но вы ничего не делаете с рекурсивными вызовами.

Например:

self.depth(Node.left)

должно быть что-то вроде

for node in self.depth(Node.left):
yield node

В Python 3. 3+ это может быть так же просто, как

yield from self.depth(Node.left)

Ваш цикл for в вашем "основном" должен выглядеть следующим образом:

for node in depthFirstSearch:
print node

Я также замечаю, что ваш алгоритм поиска первого уровня имеет правильную идею, но вы на самом деле ничего не ищете. Я предполагаю, что вы уже знаете это.

ответил(а) 2021-01-25T16:08:02+03:00 4 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема