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] Explanation: 3 cannot be a left child of 1 because 3 > 1. Swapping 1 and 3 makes the BST valid.
Example 2:

Input: root = [3,1,4,null,null,2] Output: [2,1,4,null,null,3] Explanation: 2 cannot be in the right subtree of 3 because 2 < 3. Swapping 2 and 3 makes the BST valid.
Constraints:
[2, 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.
- * struct TreeNode {
- * int val;
- * TreeNode *left;
- * TreeNode *right;
- * TreeNode() : val(0), left(nullptr), right(nullptr) {}
- * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
- * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
- * };
- */
- class Solution {
- public:
- void recoverTree(TreeNode* root) {
- TreeNode *mistake1 = nullptr, *mistake2 = nullptr;
- TreeNode *prev = new TreeNode(INT_MIN);
- inorder(root, mistake1, mistake2, prev);
- if (mistake1 && mistake2) {
- int temp = mistake1->val;
- mistake1->val = mistake2->val;
- mistake2->val = temp;
- }
- }
-
- void inorder(TreeNode* root,
- TreeNode*& mistake1,
- TreeNode*& mistake2,
- TreeNode*& prev) {
- if (root == nullptr) {return;}
- if (root->left) {inorder(root->left, mistake1, mistake2, prev);}
- if (prev && root->val < prev->val) {
- if (mistake1 == nullptr) {
- mistake1 = prev;
- mistake2 = root;
- } else {mistake2 = root;}
- }
- prev = root;
- if (root->right) {inorder(root->right, mistake1, mistake2, prev);}
- }
- };
- /**
- * Definition for a binary tree node.
- * public class TreeNode {
- * int val;
- * TreeNode left;
- * TreeNode right;
- * TreeNode() {}
- * TreeNode(int val) { this.val = val; }
- * TreeNode(int val, TreeNode left, TreeNode right) {
- * this.val = val;
- * this.left = left;
- * this.right = right;
- * }
- * }
- */
- class Solution {
- private TreeNode mistake1 = null;
- private TreeNode mistake2 = null;
- private TreeNode prev = new TreeNode(Integer.MIN_VALUE);
-
- public void recoverTree(TreeNode root) {
- inorder(root);
- if (mistake1 != null && mistake2 != null) {
- int temp = mistake1.val;
- mistake1.val = mistake2.val;
- mistake2.val = temp;
- }
- }
-
- void inorder(TreeNode root) {
- if (root == null) {return;}
- if (root.left != null) {inorder(root.left);}
- if (root.val < prev.val) {
- if (mistake1 == null) {
- mistake1 = prev;
- mistake2 = root;
- } else {
- mistake2 = root;
- }
- }
- prev = root;
- if (root.right != null) {
- inorder(root.right);
- }
- }
- }