Recover Binary Search Tree

medium tree bst dfs

Problem

Exactly two values in a BST have been swapped by mistake. Recover the tree without changing its structure.

Inputroot = [3, 1, 4, null, null, 2]
Output[2, 1, 4, null, null, 3]
Inorder = [1, 3, 4, 2] → not sorted. The first descent is 3 → 4? No, 4 → 2; mark 4 as first and 2 as second. Swap them to get [1, 2, 3, 4].

def recover_tree(root):
    first = second = prev = None
    def inorder(n):
        nonlocal first, second, prev
        if not n: return
        inorder(n.left)
        if prev and prev.val > n.val:
            if not first: first = prev
            second = n
        prev = n
        inorder(n.right)
    inorder(root)
    first.val, second.val = second.val, first.val
function recoverTree(root) {
  let first = null, second = null, prev = null;
  function inorder(n) {
    if (!n) return;
    inorder(n.left);
    if (prev && prev.val > n.val) {
      if (!first) first = prev;
      second = n;
    }
    prev = n;
    inorder(n.right);
  }
  inorder(root);
  [first.val, second.val] = [second.val, first.val];
}
class Solution {
    TreeNode first, second, prev;
    public void recoverTree(TreeNode root) {
        inorder(root);
        int t = first.val; first.val = second.val; second.val = t;
    }
    void inorder(TreeNode n) {
        if (n == null) return;
        inorder(n.left);
        if (prev != null && prev.val > n.val) {
            if (first == null) first = prev;
            second = n;
        }
        prev = n;
        inorder(n.right);
    }
}
class Solution {
public:
    TreeNode *first = nullptr, *second = nullptr, *prev = nullptr;
    void inorder(TreeNode* n) {
        if (!n) return;
        inorder(n->left);
        if (prev && prev->val > n->val) {
            if (!first) first = prev;
            second = n;
        }
        prev = n;
        inorder(n->right);
    }
    void recoverTree(TreeNode* root) { inorder(root); swap(first->val, second->val); }
};
Time: O(n) Space: O(h)