思路: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));
}
}