【问题标题】:Trying to determine if a tree is a valid binary search tree试图确定一棵树是否是有效的二叉搜索树
【发布时间】: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 &gt;= min 是否效果更好。
  • 不完全一样,因为那是tree.value &gt;= minx &lt; y 的否定是x &gt;= y
  • @LasseVågsætherKarlsen 不,这不起作用
  • 此外,你不应该在这里返回true,因为那时你不检查孩子是否有效。
  • @WillemVanOnsem 我在最后一行写了这个,所以我想这就是原因吧?我返回 true 的事实我实际上并没有检查树的其余部分,但在另一种情况下,我会继续检查,直到我看到一个错误的情况,否则它是 true。

标签: algorithm data-structures binary-search-tree


【解决方案1】:

代码没有通过所有的测试用例。这让我感到困惑,因为我觉得这两种说法都在说同样的事情。

这里有两个问题,第一个很容易解决,后者需要更广泛的代码重写。

首先,x的否定是x≥y。确实,使用 x 我们排除了 x = y 的可能性,但如果我们否定条件,我们应该允许这种情况。

接下来,如果节点的值介于 minmax 之间,您可以只返回 true。一颗树。确实:如果节点在边界之间是个好消息,但节点的子节点仍然不能是有效的二叉搜索树,因此我们需要对子节点进行递归。

因此我们可以这样写:

if(min <= tree.value && tree.value < max){
       return isValid(tree.left,min,tree.value) && isValid(tree.right,tree.value,max);
}
return false;

请注意,根据您具体实现搜索树的方式,您还需要将tree.value &lt; max 更改为tree.value &lt;= max。因为在某些树(如平衡树)中,左子子和右子有时都包含等效值。但是,如果您的搜索树只包含不同的值(通常是这种情况),这可能不是很重要。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-24
    • 2015-12-20
    相关资源
    最近更新 更多