You are given the root of a binary search tree (BST), where the values of exactly two nodes of the tree were swapped by mistake. Recover the tree without changing its structure.
Example 1:
Input: root = [1,3,null,null,2]
Output: [3,1,null,null,2]Example 2:
Input: root = [2,3,1]
Output: [2,1,3]Constraints:
2 <= The number of nodes in the tree <= 1000.-(2^31) <= Node.val <= ((2^31)-1)Follow up: A solution using O(n) space is pretty straight-forward. Could you devise a constant O(1) space solution?
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def recoverTree(self, root: Optional[TreeNode]) -> None:
"""
Do not return anything, modify root in-place instead.
"""
def isBST(node):
if not node:
return True
q = deque([(node, float("-inf"), float("inf"))])
while q:
cur, left, right = q.popleft()
if not (left < cur.val < right):
return False
if cur.left:
q.append((cur.left, left, cur.val))
if cur.right:
q.append((cur.right, cur.val, right))
return True
def dfs1(node1, node2):
if not node2 or node1 == node2:
return False
node1.val, node2.val = node2.val, node1.val
if isBST(root):
return True
node1.val, node2.val = node2.val, node1.val
return dfs1(node1, node2.left) or dfs1(node1, node2.right)
def dfs(node):
if not node:
return False
if dfs1(node, root):
return True
return dfs(node.left) or dfs(node.right)
dfs(root)
return root# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def recoverTree(self, root: Optional[TreeNode]) -> None:
"""
Do not return anything, modify root in-place instead.
"""
arr = []
def inorder(node):
if not node:
return
inorder(node.left)
arr.append(node)
inorder(node.right)
inorder(root)
node1, node2 = None, None
for i in range(len(arr) - 1):
if arr[i].val > arr[i + 1].val:
node2 = arr[i + 1]
if node1 is None:
node1 = arr[i]
else:
break
node1.val, node2.val = node2.val, node1.val# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def recoverTree(self, root: Optional[TreeNode]) -> None:
stack = []
node1 = node2 = prev = None
curr = root
while stack or curr:
while curr:
stack.append(curr)
curr = curr.left
curr = stack.pop()
if prev and prev.val > curr.val:
node2 = curr
if not node1:
node1 = prev
else:
break
prev = curr
curr = curr.right
node1.val, node2.val = node2.val, node1.val# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def recoverTree(self, root: Optional[TreeNode]) -> None:
node1 = node2 = prev = None
curr = root
while curr:
if not curr.left:
if prev and prev.val > curr.val:
node2 = curr
if not node1:
node1 = prev
prev = curr
curr = curr.right
else:
pred = curr.left
while pred.right and pred.right != curr:
pred = pred.right
if not pred.right:
pred.right = curr
curr = curr.left
else:
pred.right = None
if prev and prev.val > curr.val:
node2 = curr
if not node1:
node1 = prev
prev = curr
curr = curr.right
node1.val, node2.val = node2.val, node1.val