Для этого вопроса о коде 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 всегда будет истинным. Но в действительности это, кажется, не так. Может кто-нибудь объяснить, что здесь происходит?