重点
1 inorder
2 怎么用O(1)的space, 必然是用tmp的指针做swap
ref http://www.cnblogs.com/springfor/p/3891390.html
public class Solution {
TreeNode first, pre, second;
public void recoverTree(TreeNode root) {
// ref http://www.cnblogs.com/springfor/p/3891390.html
if(root==null) return;
int tmp = 0;
inorder(root);
if(first!=null && second !=null){
tmp = first.val;
first.val = second.val;
second.val = tmp;
}
return;
}
public void inorder(TreeNode root){
if(root==null) return;
inorder(root.left);
if(pre==null){
pre = root;
}else{
if(pre.val>root.val){ // in order, therefore pre>root>root.right...
if(first==null) // 因为如果已经找到了first,那么被swap到右面的小的点必然还会小于pre一次
first = pre;
second = root;
}
pre = root; // 往右面移位
}
inorder(root.right);
}
}