Data structures 给出一个树检查,如果它是一个有效的BST

Data structures 给出一个树检查,如果它是一个有效的BST,data-structures,Data Structures,有人能帮我解释一下我的逻辑哪里出了问题吗? 问题是给你一个树的根,你需要知道树是否是BST 节点左子树中每个节点的数据值都小于该节点的数据值。 节点右子树中每个节点的数据值都大于该节点的数据值。 给定一棵二叉树的根节点,你能确定它是否也是一棵二叉搜索树吗 boolean checkBST(Node root) { if(root.left==null && root.right==null) return true; if(root.left!=null) {

有人能帮我解释一下我的逻辑哪里出了问题吗? 问题是给你一个树的根,你需要知道树是否是BST

节点左子树中每个节点的数据值都小于该节点的数据值。 节点右子树中每个节点的数据值都大于该节点的数据值。 给定一棵二叉树的根节点,你能确定它是否也是一棵二叉搜索树吗

boolean checkBST(Node root) {
  if(root.left==null && root.right==null)
    return true;
  if(root.left!=null) {
    if(root.data<root.left.data)
      checkBST(root.left);
    else
      return false;
  }
  if(root.right!=null) {
    if(root.data>root.right.data)
      checkBST(root.right);
    else 
      return false;
  }
  return true;
}
boolean checkBST(节点根){
if(root.left==null&&root.right==null)
返回true;
if(root.left!=null){
if(root.dataroot.right.data)
checkBST(root.right);
其他的
返回false;
}
返回true;
}

您的比较结果是相反的。如果这是一个有效的BST,则根中的数据不应小于其左子树中的数据,同样,根中的值不应大于其右子树中的数据

还请注意,在上面的语句中,我包含了相等-通常BST允许相等的元素,它们可以放在左侧或右侧

最后最重要的一点——如果这是一个有效的BST,那么根应该不少于其左子树中的所有节点。仅将该值与左子树的根进行比较。但是,左子树的根小于其右子树中的所有注释,因此这些节点可能比原始根大。考虑这个例子:

    10
   /
  5
 / \
3   13

根据您的检查,这是一个有效的BST,而不是

BST具有以下属性

  • 节点的左子树仅包含键小于节点键的节点
  • 节点的右子树仅包含键大于节点键的节点
  • 左子树和右子树也必须是二进制搜索树
代码
bool isBst(Node*Node,int left=int_MIN,int right=int_MAX){
如果(!节点)
返回true;
如果(节点->数据<左| |节点->数据>右)
返回false;
返回isBst(节点->左,左,节点->数据)
&&isBst(节点->右侧,节点->数据,右侧);
}

我不知道为什么这个问题会得到这么多的反对票,但一般来说,在你提出问题后,请尝试改进问题的格式。我重新格式化了代码以使其更具可读性,并且编辑了标题以反映您要求的答案,与此问题相同:,并且您的初始实现也以同样的方式被破坏。也许你有相同的教授。如果你的教授告诉你,你可以通过比较每个节点和它的子节点来检查一个二叉树,那么请告诉他这个答案,这样他就不会再犯同样的错误了。
bool isBst(Node *node, int left = INT_MIN, int right = INT_MAX){
    if (!node)
        return true;
    if (node->data < left || node->data > right)
       return false;
    return isBst(node->left, left, node->data) 
                 && isBst(node->right, node->data, right);
}