Как сделать рекурсивный генератор? - PullRequest
0 голосов
/ 06 ноября 2018

Я пытаюсь сделать preOrder рекурсивным, чтобы я мог сделать что-то вроде:

Учитывая массив представлений дерева [2,1,3] (программа фактически использует TreeNode, а именно TreeNode (2)

x = preOrder(root)
print x.next() # 1
print x.next() # 2
print x.next() # 3

Но, учитывая следующий код, я могу вызвать x.next () только один раз, и после первой итерации ничего не возвращается.

    def preOrder(root):
        if root is not None:
            preOrder(root.left)
            self.lChild = root.left
            self.rChild = root.right
            yield root.val
            preOrder(root.right)

Как я могу это исправить?


# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

1 Ответ

0 голосов
/ 06 ноября 2018

Вы можете исправить это так:

class TreeNode(object):
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None

    def __repr__(self):
        return str(self.val)


three = TreeNode(3)
one = TreeNode(1)
two = TreeNode(2)
two.left = one
two.right = three


def pre_order(root):
    if root is not None:
        yield from pre_order(root.left)
        yield root.val
        yield from pre_order(root.right)


for e in pre_order(two):
    print(e)

выход

1
2
3

По сути, вам нужно также отказаться от рекурсивных вызовов. Учитывая, что вы используете Python 2.7 см .:

  1. Преобразование оператора yield from в код Python 2.7
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...