Java 这个算法是如何按照预期工作的?尽管溢出
我正试图解决这个问题: 给定一个非空的二进制搜索树和一个目标值,找到 BST中最接近目标的值 注意:给定的目标值是一个浮点。你一定会的 BST中只有一个最接近目标的唯一值 这是我在网上看到的一个解决方案:Java 这个算法是如何按照预期工作的?尽管溢出,java,algorithm,language-agnostic,binary-search-tree,Java,Algorithm,Language Agnostic,Binary Search Tree,我正试图解决这个问题: 给定一个非空的二进制搜索树和一个目标值,找到 BST中最接近目标的值 注意:给定的目标值是一个浮点。你一定会的 BST中只有一个最接近目标的唯一值 这是我在网上看到的一个解决方案: public int closestValue(TreeNode root, double target) { int ret = root.val; while(root!=null) { if(Math.abs(target - r
public int closestValue(TreeNode root, double target) {
int ret = root.val;
while(root!=null) {
if(Math.abs(target - root.val) > Integer.MAX_VALUE){
System.out.println( " Underflow!");
}
if(Math.abs(target - root.val) < Math.abs(target -ret)){
ret = root.val;
}
root = (target < root.val)? root.left : root.right;
}
return ret;
}
其中,
150000000
是父节点,140000000
是左子节点,-150000000.0
是目标节点。我希望代码在Math.abs子句中下溢(确实如此),因为-150000000-150000000
大于Int.MIN\u值。但我不明白该算法如何仍然返回140000000
。下溢不应该导致比较失败吗?target
是一个double
,因此任何涉及它和int
的表达式都将导致int
升级为double
。此表达式在循环的第一次迭代中不正确:Math.abs(target-root.val)>Integer.MAX_VALUE
@Aldert,添加了目标值。@Selindek用我从复制post逐字记录的第三方收集的信息更新了问题陈述中的问题。target
是一个double
,因此,任何包含它和int
的表达式都将导致int
提升为double
。此表达式在循环的第一次迭代中不是真的:Math.abs(target-root.val)>Integer.MAX_VALUE
@Aldert,添加了目标值。@Selindek使用我从复制帖子的第三方收集的内容更新了问题陈述中的问题。
[1500000000,1400000000]
-1500000000.0