An inorder traversal of a valid BST is sorted. If two nodes are swapped, there will be one or two locations where curr.val < prev.val. We find these "dropped" values and swap them back.
- Initialize
first = None,second = None, andprev = TreeNode(-infinity). - Perform an inorder traversal (Recursive or Iterative).
- In each step:
- If
curr.val < prev.val:- If
firstis None:first = prev(the first problematic node). second = curr(the second problematic node).
- If
prev = curr.
- If
- After traversal, swap values:
first.val, second.val = second.val, first.val.
- Time Complexity: O(N).
- Space Complexity: O(H).
def recover_tree(root):
first = second = prev = None
def inorder(node):
nonlocal first, second, prev
if not node: return
inorder(node.left)
# Inorder property violation
if prev and node.val < prev.val:
if not first:
first = prev
second = node
prev = node
inorder(node.right)
inorder(root)
# Swap the values
if first and second:
first.val, second.val = second.val, first.val