leetcode--RecoverBinarySearchTree

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章