【问题标题】:Why is Integer.MIN_VALUE failing on Balanced Binary Tree? What's the bug?为什么 Integer.MIN_VALUE 在平衡二叉树上失败?什么是错误?
【发布时间】:2015-12-16 04:58:22
【问题描述】:

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);
    }
}

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

例如

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

输出:真

预期:错误

【问题讨论】:

    标签: java recursion tree


    【解决方案1】:

    由于整数运算溢出,您的代码失败。下面的代码 sn -p 将证明这一点:

    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 语句将在它确实应该触发false 时触发true

    解决方案:

    如果您将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);
        }
    }
    

    【讨论】:

    • 这完全相反,应该返回true的时候返回false。但它只发生在非常特殊的情况下,请参阅我的回答。你的情况实际上并没有伤害。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-01
      • 2012-12-31
      • 1970-01-01
      相关资源
      最近更新 更多