当前位置: 首页 > 知识库问答 >
问题:

为什么Integer.MIN_VALUE在平衡二叉树上失败?有什么错误?

赵朝
2023-03-14

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。MIN_VALUE,我的代码失败。有什么问题?

例如

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

输出:真

应为:false

共有2个答案

须衡虑
2023-03-14

在某些情况下由于溢出可能会失败,如果l为零,r为Integer.MIN_VALUEl-r实际上是负数,因为它溢出了,结果条件会失败,下一条语句返回max ofMIN_VALUE1零1

燕凯旋
2023-03-14

由于整数运算溢出,代码失败。下面的代码段将演示这一点:

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

解决方案:

如果您将get水准()方法修改为以下内容,您应该绕过您遇到的问题:

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);
    }
}
 类似资料:
  • hashMap红黑树是校招面试常见的考点之一,比如经典的试题 “为什么hashMap底层结构用红黑树而不用平衡二叉数呢”。 前两天,我们面试了一个实习生,先问项目的部分,但是这个同学的项目准备的不是很好,我们就说这个水平估计过不了,学生着急了,说这个八股文和hashMap红黑树都准备了很多。 那我紧接着就问了一个红黑树的问题。我说hashMap底层的结构用了红黑树,为什么这个底层结构用红黑树而不用

  • 这是BST Add中二进制搜索树中add的实现 我的问题是,即使二元搜索树是不平衡的,同样的策略是否也能用于分析add的运行时?你要做多少次切割。运行时不是仍然是O(logn),而不是O(n)吗?如果是这样的话,有人能证明为什么它会是O(n)吗?

  • 主要内容:二叉树的性质,满二叉树,完全二叉树,总结通过《 树的存储结构》一节的学习,我们了解了一些树存储结构的基本知识。本节将给大家介绍一类具体的树结构—— 二叉树。 简单地理解,满足以下两个条件的树就是二叉树: 本身是有序树; 树中包含的各个节点的度不能超过 2,即只能是 0、1 或者 2; 例如,图 1a) 就是一棵二叉树,而图 1b) 则不是。 图 1 二叉树示意图 二叉树的性质 经过前人的总结,二叉树具有以下几个性质: 二叉树中,第 i

  • 平衡二叉树被定义为任何节点的两个子树的高度相差不超过一的树。 我的问题是,如果其中一个子树不存在或基本上子树为空怎么办

  • 主要内容:二叉排序树转化为平衡二叉树,构建平衡二叉树的代码实现,总结上一节介绍如何使用二叉排序树实现动态 查找表,本节介绍另外一种实现方式—— 平衡二叉树。 平衡二叉树,又称为  AVL 树。实际上就是遵循以下两个特点的二叉树: 每棵子树中的左子树和右子树的深度差不能超过 1; 二叉树中每棵子树都要求是平衡二叉树; 其实就是在二叉树的基础上,若树中每棵子树都满足其左子树和右子树的深度差都不超过 1,则这棵二叉树就是平衡二叉树。 图 1 平衡与不平衡的二叉树及结点的

  • NowCoder 题目描述 平衡二叉树左右子树高度差不超过 1。 解题思路 // java private boolean isBalanced = true; public boolean IsBalanced_Solution(TreeNode root) { height(root); return isBalanced; } private int height(Tre