【发布时间】:2019-08-17 17:09:36
【问题描述】:
下面的代码通过了我们试图确定一棵树是否是有效的 BST 的所有测试用例。
public static boolean validateBst(BST tree) {
return isValid(tree, Integer.MIN_VALUE, Integer.MAX_VALUE);
}
public static boolean isValid(BST tree, int min, int max) {
if (tree == null) {
return true;
}
if (tree.value < min || tree.value >= max) {
return false;
}
return isValid(tree.left, min, tree.value) && isValid(tree.right, tree.value, max);
}
上面的代码检查一棵树是否是一个有效的 BST。逻辑很简单,如果一棵树为空,那么它就是一个 BST。如果树的值小于最小值且大于最大值,则返回 false,因为它不是有效的 BST 条件。
我遇到的问题是当我更改以下行时:
if (tree.value < min || tree.value >= max) {
return false;
}
到下面
if (tree.value > min && tree.value < max) {
return true
}
代码没有通过所有的测试用例。这让我感到困惑,因为我觉得这两种说法都在说同样的事情。
第一个 if 语句是说如果树/节点的值小于最小值或大于最大值,那么你不是一个有效的 BST,第二个语句是说你的值是否在 min 和最多你是一个有效的 bst。
所以请帮助我理解为什么当我更改该行时,我的代码没有通过所有测试用例。
是因为当我改变那条线并返回真时,我不会检查树的其余部分吗?
【问题讨论】:
-
试试
tree.value >= min是否效果更好。 -
不完全一样,因为那是
tree.value >= min。x < y的否定是x >= y。 -
@LasseVågsætherKarlsen 不,这不起作用
-
此外,你不应该在这里返回
true,因为那时你不检查孩子是否有效。 -
@WillemVanOnsem 我在最后一行写了这个,所以我想这就是原因吧?我返回 true 的事实我实际上并没有检查树的其余部分,但在另一种情况下,我会继续检查,直到我看到一个错误的情况,否则它是 true。
标签: algorithm data-structures binary-search-tree