测试树是不是是二叉搜索树[重复]

Posted

技术标签:

【中文标题】测试树是不是是二叉搜索树[重复]【英文标题】:Test if tree is Binary Search tree [duplicate]测试树是否是二叉搜索树[重复] 【发布时间】:2018-08-07 16:33:00 【问题描述】:

我知道我不应该在这里问这些类型的问题,但我被卡住了,无法弄清楚问题所在。所以, 我编写了这段代码,它将树的根作为输入,并检查给定的树是否是 BST。但是我没有通过几个测试用例,我不明白为什么?如果有人能告诉我我的代码有什么问题,那将不胜感激。 这是问题Is This a Binary Search Tree?的链接

这里是代码。

bool checkBST(Node* root) 
    if(root == NULL)
        return false;


        int d = root->data;
        bool r1 = true,r2=true;
        if(root->left != NULL)
            if(d < root->left->data)
                r1 = false;
            else
                r1 = checkBST(root->left);

        

        if(root->right != NULL)
            if(d > root->right->data)
                r2 = false;
            else
                r2 = checkBST(root->right);
        
        return r1 && r2;

    

【问题讨论】:

测试用例是你的还是你自己写过测试用例?您是否使用调试器逐步完成了有趣的测试用例? 一棵空树可能是一个有效的 BST。 这是什么:r1*r2 使用二元运算符。 r1 &amp;&amp; r2 另外,请使用 AND (&amp;&amp;) 而不是布尔值相乘... 另外r1 = false;在右边检查应该是r2 = false; 【参考方案1】:

问题可能是您仅根据其父节点检查每个节点。请记住,整个子树必须位于父树的任一侧。

EG

                   10

           4

       2      12

这将传递您的代码。每个孩子都是与其直接父母相关的正确值。但是 12 比根 10 大,但是在左子树中。

#include <climits>

bool checkBST(Node* root, int min, int max) 
    if (!root) return true;

    return (min <= root->data && root->data <= max)
        && checkBST(root->left, min, root->data-1)
        && checkBST(root->right, root->data+1, max);

bool checkBST(Node* root) 
    return checkBST(root, INT_MIN, INT_MAX);

【讨论】:

INT_MIN 和 INT_MAX 的初始值是多少? @happysharma:它们是平台特定的 int 最小值和最大值。见:cplusplus.com/reference/climits 好吧,还有一件事,如果你不介意的话,我无法理解传递 root->data-1 和 root->data+1 背后的逻辑。抱歉,我刚开始学习 Algo 和 DS。 @happysharma 因此,当您搜索左子树时,您必须更新最大值,使其低于当前值。所以当我调用checkBST(root-&gt;left,...) 时,我将最大值设置为比当前节点的值小一。 root-&gt;data-1 @happysharma 因此,当您搜索正确的子树时,您必须更新最小值,使其大于当前值。因此,当我调用checkBST(root-&gt;right,...) 时,我将最小值设置为比当前节点的值大一。 root-&gt;data+1【参考方案2】:

为什么不这样:

int checkBST(Node *root, int min, int max) 
  /* an empty tree is BST */
  if (root == NULL)
    return true;

  /* false if this node violates the min/max constraint */
  if (root->data < min || root->data > max)
    return 0;

  /* otherwise check the subtrees recursively, 
   tightening the min or max constraint */
  return
  checkBST(root->left, min, root->data - 1) && // Allow only distinct values
    checkBST(root->right, root->data + 1, max);


int checkBST(Node *root) 
    return checkBST(root, INT_MIN, INT_MAX);

然后你会这样调用函数:

checkBST(tree)

您的主要问题是您没有跟踪子 BST 受限制的 minmax 值。此外,null 树是 BST。

【讨论】:

有趣的方法。它适用于具有定义平台限制的任何数字数据。它需要一个前端来保持OP的入口界面。有些东西告诉我,从中提取的编程挑战网站将需要它。 @WhozCraig “它需要一个前端来保持 OPs 入口界面”是什么意思? OPs 函数采用单个节点指针。你的也应该;至少是最初的条目。它是 C++,所以一个简单的重载就可以解决这个问题,即:checkBST(tree) 调用您的 checkBST(tree, INT_MIN, INT_MAX) 否则它将与站点期望的测试套件的预期接口不匹配。 @WhozCraig 哦,谢谢你的提示。查看我的编辑。 已经做了,并且已经打勾。谢谢。

以上是关于测试树是不是是二叉搜索树[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在 Haskell 中查找一棵树是不是是二叉搜索树

hihocoder 是二叉搜索树吗?(模拟题)

剑指OFFER 二叉搜索树的后序遍历

给定二叉树是不是为二叉搜索树

二十一:判断二叉树是否是二叉查找树?

二叉树:我是不是一棵二叉搜索树