【问题标题】:Checking that [1, null, 1] and [1, 1] are valid Binary Search Trees检查 [1, null, 1] 和 [1, 1] 是有效的二叉搜索树
【发布时间】:2021-07-20 08:33:39
【问题描述】:

[1, null, 1][1, 1] 可能的二叉搜索树是什么?会有什么不同吗?

我的代码验证 [1, 1] 为 BST 但不是 [1, null, 1],我不明白为什么...

bool isBST(TreeNode* root, int max, int min){
    if(!root)
        return true;
    if((max!= NULL && max<=root->val) || (min!= NULL && min>root->val))
        return false;
    if(!isBST(root->left, root->val, min) || !isBST(root->right, max, root->val))
        return false;
    return true;
}
bool isValidBST(TreeNode* root) {
    int min =NULL, max = NULL;
    return isBST(root, NULL, NULL);
}

为什么我的代码对于 [1, null, 1] 没有返回 true?

【问题讨论】:

  • if((max!= NULL &amp;&amp; max&lt;=root-&gt;val)
  • [1,null,1] 到底是什么意思?除了它不是树这一事实之外,您似乎还将整数与指针混淆了。请出示minimal reproducible example
  • @wildplasser 旁白:“这里将整数与指针(常量)进行比较。” --> 也许。 NULL 可能是某种整数类型的 0。仍然看起来错了。
  • 还是废话。类型确实存在。比较不同类型的值可能并不总是有意义。 (恕我直言:从不,除非是可取的)

标签: c binary-tree binary-search-tree


【解决方案1】:

数组格式通常是树中值的广度优先顺序,其中null 是没有节点的占位符。

所以例如[1, 1] 是这棵树的表示:

      1
     /
    1

[1, null, 1] 是这棵树的表示:

       1
      / \
   null  1 

这是:

       1 
        \
         1

另一个更大的例子:[10, 5, 8, 2, null, 6, null, 1, 3, null, 7] 代表:

           10
          /  \
         5    8
        /    /
       2    6
      / \    \
     1   3    7

所以,是的,[1, 1][1, null, 1] 之间是有区别的。

您的代码不认为第二个有效的原因是因为在这一行中进行了比较:

if((max!= NULL && max<=root->val) || (min!= NULL && min>root->val))
//                   ^^

你应该允许一个值等于max,所以正确如下:

if((max!= NULL && max< root->val) || (min!= NULL && min>root->val))

其他一些评论:

  • 我发现您的函数首先采用max 参数,然后是min,这让我感到困惑。考虑改变这两个参数的顺序。

  • 使用NULL 作为minmax 的初始值可能会在您的树恰好具有等于NULL 的值时导致问题(在大多数环境中,0 将等于NULL)。考虑分别使用INT_MININT_MAX作为初始值,然后你也可以去掉isBST函数中的额外条件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-01
    • 1970-01-01
    • 2018-08-10
    • 2016-03-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多