思路:BST中序遍歷生成從小到大的排序數組,如果交換兩個節點,相當於交換了數組中的兩個數字。我們只要找出中序遍歷中不符合排序順序的兩個數字即可。可以利用指針pre記錄前一個節點,當後節點小於前節點時有問題。注意當交換的是相鄰的兩個數字時只能找到一個節點是大於前節點的。
/**
* Created by marsares on 15/6/19.
*/
public class RecoverBinarySearchTree {
TreeNode pre=null;
TreeNode swap1=null;
TreeNode swap2=null;
public void recoverTree(TreeNode root) {
traversal(root);
int tmp=swap1.val;
swap1.val=swap2.val;
swap2.val=tmp;
}
public void traversal(TreeNode root){
if(root==null)return;
traversal(root.left);
if(pre!=null&&pre.val>root.val&&swap1==null){
swap1=pre;
swap2=root;
}
else if(pre!=null&&pre.val>root.val&&swap1!=null)swap2=root;
pre=root;
traversal(root.right);
}
public static void main(String[]args){
RecoverBinarySearchTree rbst=new RecoverBinarySearchTree();
BinaryTreeSerialize bts=new BinaryTreeSerialize();
TreeNode root=bts.Unserialize("{5,4,8,2,3,6,9}");
rbst.recoverTree(root);
System.out.println(bts.Serialize(root));
}
}