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否则无效。
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;
}
添加回答
举报