Восстановить бинарное дерево

Для этого вопроса о коде leet этот код проходит все тест-кейсы.

class Solution(object):
def recoverTree(self, root):
    self.first = None
    self.second = None
    self.prev = TreeNode(float('-inf'))

    self.traverse(root)

    temp = self.first.val
    self.first.val = self.second.val
    self.second.val = temp

def traverse(self, root):
    if not root:
        return
    self.traverse(root.left)
    if not self.first and self.prev.val >= root.val:
        self.first = self.prev
    if self.first and self.prev.val >= root.val:
        self.second = root
    self.prev = root
    self.traverse(root.right)

У меня есть вопрос об одной части этого кода.

if not self.first and self.prev.val >= root.val:
    self.first = self.prev
if self.first and self.prev.val >= root.val:
    self.second = root

В этом фрагменте второе условие всегда будет истинным после того, как установлено первое. Итак, вы можете написать это как:

def not self.first and self.prev.val >= root.val:
    self.first = self.prev
    self.second = root

Но если я попробую это, я не пройду тестовые случаи. Почему это так? Похоже, если мы примем условие для первого оператора if и назначим self.first, условие для второго оператора if всегда будет истинным. Но в действительности это, кажется, не так. Может кто-нибудь объяснить, что здесь происходит?


person user3408657    schedule 12.10.2016    source источник
comment
Во втором операторе if нет   -  person Natecat    schedule 12.10.2016
comment
@Natecat, но если первое утверждение if истинно, как в self.first, равно None, то, когда мы переходим к утверждению, мы устанавливаем self.first = self.prev, тогда self.First больше не равно None, и условие для второй оператор if всегда будет истинным.   -  person user3408657    schedule 12.10.2016


Ответы (1)


Код отличается, потому что вы все еще хотите запустить self.second = root. Вы хотите запустить эту строку независимо от того, было ли self.first true или false до того, как вы начали играть с ней.

Вероятно, есть тест, в котором self.first равен true, а ожидаемый результат - self.second == root.

person Vikram Saran    schedule 12.10.2016