Two elements of a binary search tree (BST) are swapped by mistake.
Recover the tree without changing its structure.
Input: [1,3,null,null,2]
1
/
3
\
2
Output: [3,1,null,null,2]
3
/
1
\
2
Input: [3,1,4,null,null,2]
3
/ \
1 4
/
2
Output: [2,1,4,null,null,3]
2
/ \
1 4
/
3
class Solution {
public void recoverTree(TreeNode root) {
TreeNode pre = null;
TreeNode first = null, second = null;
// Morris Traversal
// IN ORDER traversal using Morris
while (root != null) {
if (root.left != null) {
// connect threading for root
TreeNode temp = root.left;
while (temp.right != null && temp.right != root)
temp = temp.right;
// the threading already exists then just deconstruct the thread
if (temp.right != null) {
temp.right = null;
if (pre != null && pre.val > root.val) {
if (first == null)
first = pre;
second = root;
}
pre = root;
root = root.right;
} else {
// construct the threading
temp.right = root;
root = root.left;
}
} else {
if (pre != null && pre.val > root.val) {
if (first == null)
first = pre;
second = root;
}
pre = root;
root = root.right;
}
}
// swap two node values;
if (first != null && second != null) {
int t = first.val;
first.val = second.val;
second.val = t;
}
}
}