Sunday, July 9, 2017

99. Recover Binary Search Tree

难点是给那个invaliPair赋值
有一种特殊情况是switch两个相邻的值,这样prev和curr会同时发现
所以不能用if else语句
这里的逻辑是每次都把curr更新为invalidPair[1]
而对于invalidPair[0]只赋值一次
这样如果相邻则一次性都赋值,如果不相邻后面的invalidPair[1]也会把之前的覆盖掉


74.90 %
/*
invalid pairs:

    prev curr
          prev  curr
1   [4     3    2]   5
*/


public class Solution {
    public void recoverTree(TreeNode root) {
        TreeNode[] invalidPair = new TreeNode[2];
        recoverTree(root, invalidPair);
        if (invalidPair[0] != null && invalidPair[1] != null) {
           
            int temp = invalidPair[0].val;
            invalidPair[0].val = invalidPair[1].val;
            invalidPair[1].val = temp;
        }
    }
    private TreeNode prev = null;
    private void recoverTree(TreeNode root, TreeNode[] invalidPair) {
        if (root == null) return;
        recoverTree(root.left, invalidPair);
       
        if (prev != null && prev.val >= root.val) {
            if(invalidPair[0] == null) {
                invalidPair[0] = prev;
            }
            invalidPair[1] = root;
        }
        prev = root;
        recoverTree(root.right, invalidPair);
    }
}

No comments:

Post a Comment