为什么Integer.MIN_VALUE在平衡二叉树上失败?什么是虫子?

时间:2015-12-16 04:58:22

标签: java recursion tree

https://leetcode.com/problems/balanced-binary-tree/

  

给定二叉树,确定它是否是高度平衡的。

     

对于此问题,高度平衡的二叉树被定义为二进制   每个节点的两个子树的深度永远不会相同的树   超过1。

public class Solution {
    public boolean isBalanced(TreeNode root) {

        int ret = getLevel(root);
        if(ret < 0)
            return false;

        return true;

    }
    public int getLevel(TreeNode node) {

        if(node == null)
            return 0;

        int l = getLevel(node.left);
        int r = getLevel(node.right);
        if(Math.abs(l - r) > 1)
            return -99;

        return Math.max(l + 1, r + 1);
    }
}

此代码已被接受。 但是如果我用Integer.MIN_VALUE替换-99,我的代码就会失败。这是什么错误?

e.g。

  

输入:[1,2,null,3,null,4,null,5]

     

输出:true

     

预期:错误

2 个答案:

答案 0 :(得分:3)

由于整数运算溢出,您的代码失败了。以下代码段将演示此内容:

int val = Integer.MIN_VALUE;
System.out.println(val);
val -= 3;
System.out.println(val);

<强>输出:

-2147483648
2147483645

现在考虑实际代码中发生的事情:

int l = getLevel(node.left);
// l == -2147483648 == Integer.MIN_VALUE assuming your base case is hit
int r = getLevel(node.right);
// assuming positive r, then Math.abs() will return a massively positive number
if (Math.abs(l - r) > 1)
        return -99;

换句话说,上述if语句将在true真正解雇时false被解雇。

<强>解决方案:

如果您将getLevel()方法修改为以下内容,则应该解决您遇到的问题:

public int getLevel(TreeNode node) {
    if(node == null)
        return 0;

    int l = getLevel(node.left);
    int r = getLevel(node.right);
    if ( (l < 0 ^ r < 0) || Math.abs(l - r) > 1) {
        // you can simply return -1 here, since an actual
        // level should never have a negative value
        return -1;
    }
    else {
        return Math.max(l + 1, r + 1);
    }
}

答案 1 :(得分:0)

由于溢出,在某些情况下可能会失败。如果l为零且r为Integer.MIN_VALUE,则l-r实际上是负数,因为它会溢出。因此,条件将失败,下一个语句将返回MIN_VALUE+1zero+1的最大值。