给出树检查它是否是有效的BST

时间:2017-08-15 09:21:02

标签: data-structures

有人可以帮我解决逻辑错误的地方吗? 问题如果树是否为BST,您需要知道树的根

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

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;
}

2 个答案:

答案 0 :(得分:0)

您的比较相反。如果这是有效的BST,则根中的数据应不小于其左子树中的数据,并且类似地,根中的值应不大于其右子树中的数据。

另请注意,在上面的陈述中我包括了相等 - 通常BST允许相等的元素,它们可以放在左侧或右侧。

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

    10
   /
  5
 / \
3   13

根据您的检查,这是一个有效的BST,而事实并非如此。

答案 1 :(得分:0)

BST具有以下属性。

  • 节点的左子树仅包含键小于节点键的节点。
  • 节点的右子树只包含键大于节点键的节点。
  • 左右子树也必须是二叉搜索树。

代码

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);
}