Понимание порядка выполнения рекурсии в a для l oop + yield - PullRequest
0 голосов
/ 29 апреля 2020

код на самом деле является решением этого вопроса: https://leetcode.com/problems/binary-search-tree-iterator/

это в основном итератор для обхода в порядке следования по BST. Поэтому каждый раз, когда я вызываю next (), он печатает следующее число: сначала 20, потом 30, потом 33..et c.

Я сталкивался с таким решением:

class BSTIterator:

    def __init__(self, root):
        self.last = root
        while self.last and self.last.right:
            self.last = self.last.right
        self.current = None
        self.g = self.iterate(root)

    # @return a boolean, whether we have a next smallest number
    def hasNext(self):
        return self.current is not self.last

    # @return an integer, the next smallest number
    def next(self):
        return next(self.g)

    def iterate(self, node):
        if node is None:
            return
        for x in self.iterate(node.left):
            yield x
        self.current = node
        yield node.val
        for x in self.iterate(node.right):
            yield x

             50
          /     \
         /       \
        30       70
       /  \     /  \
      20  40   60  80
          /
        33

Я пытался отладить его, но я до сих пор не понимаю порядок выполнения команд внутри iterate (), особенно то, что происходит при втором вызове next (). Сочетание саморекурсии с выходом делает его слишком сложным для отслеживания.

Спасибо

...