为了账号安全,请及时绑定邮箱和手机立即绑定

您如何验证二叉搜索树?

您如何验证二叉搜索树?

我在这里阅读了采访中的一项练习,即验证二进制搜索树。这是如何工作的?验证二叉搜索树会寻找什么?我已经写了一个基本的搜索树,但是从未听说过这个概念。
查看完整描述

3 回答

?
陪伴而非守候

TA贡献1757条经验 获得超8个赞

其实那是每个人在面试中犯的错误。


必须根据(minLimitof node,node.value)检查Leftchild


必须根据(node.value,nodeMaxLimit)检查Rightchild


IsValidBST(root,-infinity,infinity);


bool IsValidBST(BinaryNode node, int MIN, int MAX) 

{

     if(node == null)

         return true;

     if(node.element > MIN 

         && node.element < MAX

         && IsValidBST(node.left,MIN,node.element)

         && IsValidBST(node.right,node.element,MAX))

         return true;

     else 

         return false;

}

另一个解决方案(如果空间不是约束):对树进行有序遍历,并将节点值存储在数组中。如果数组按排序顺序排列,则其有效的BST否则无效。

查看完整回答
反对 回复 2019-11-25
?
一只甜甜圈

TA贡献1836条经验 获得超5个赞

“验证”二进制搜索树意味着您要检查它的确确实有所有较小的项目在左侧,而较大的项目在右侧。本质上,这是检查二进制树是否为二进制搜索树。


查看完整回答
反对 回复 2019-11-25
?
一只斗牛犬

TA贡献1784条经验 获得超2个赞

我发现最好的解决方案是O(n),它不占用任何额外空间。它类似于有序遍历,但不是将其存储到数组中然后检查它是否已排序,我们可以采用一个静态变量,并在有序遍历时检查数组是否已排序。


static struct node *prev = NULL;


bool isBST(struct node* root)

{

    // traverse the tree in inorder fashion and keep track of prev node

    if (root)

    {

        if (!isBST(root->left))

          return false;


        // Allows only distinct valued nodes

        if (prev != NULL && root->data <= prev->data)

          return false;


        prev = root;


        return isBST(root->right);

    }


    return true;

}


查看完整回答
反对 回复 2019-11-25
  • 3 回答
  • 0 关注
  • 650 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信