1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
|
class Solution: def recoverTree(self, root): res, stack, first, second = None, [], None, None while True: while root: stack.append(root) root = root.left if not stack: break node = stack.pop() if res and res.val > node.val: if not first: first = res second = node res = node root = node.right first.val, second.val = second.val, first.val
def recoverTree2(self, root): self.prevNode = TreeNode(-sys.maxsize-1) self.first, self.second = None, None self.inorder(root) self.first.val, self.second.val = self.second.val, self.first.val
def inorder(self, root): if not root: return self.inorder(root.left) if not self.first and self.prevNode.val > root.val: self.first, self.second = self.prevNode, root if self.first and self.prevNode.val > root.val: self.second = root self.prevNode = root self.inorder(root.right)
def recoverTree3(self, root): res = [] self.helper(root, res) first, second = None, None for i in xrange(1, len(res)): if not first and res[i-1].val > res[i].val: first, second = res[i-1], res[i] if first and res[i-1].val > res[i].val: second = res[i] first.val, second.val = second.val, first.val
def helper(self, root, res): if root: self.helper(root.left, res) res.append(root) self.helper(root.right, res)
|