问题描述
[1,null,1]
和 [1,1]
可能的二叉搜索树是什么?会有什么不同吗?
我的代码将 [1,1]
验证为 BST 而不是 [1,1]
,我不明白为什么...
bool isBST(TreeNode* root,int max,int min){
if(!root)
return true;
if((max!= NULL && max<=root->val) || (min!= NULL && min>root->val))
return false;
if(!isBST(root->left,root->val,min) || !isBST(root->right,max,root->val))
return false;
return true;
}
bool isValidBST(TreeNode* root) {
int min =NULL,max = NULL;
return isBST(root,NULL,NULL);
}
为什么我的代码没有为 [1,1]
返回 true?
解决方法
数组格式通常是树中值的广度优先顺序,其中 null
是没有节点的占位符。
例如 [1,1]
是这棵树的表示:
1
/
1
而 [1,null,1]
是这棵树的表示:
1
/ \
null 1
是:
1
\
1
另一个更大的例子:[10,5,8,2,6,1,3,7]
代表:
10
/ \
5 8
/ /
2 6
/ \ \
1 3 7
所以,是的,[1,1]
和 [1,1]
之间是有区别的。
您的代码不认为第二个有效的原因是因为在这一行中进行了比较:
if((max!= NULL && max<=root->val) || (min!= NULL && min>root->val))
// ^^
你应该允许一个值等于到max
,所以更正如下:
if((max!= NULL && max< root->val) || (min!= NULL && min>root->val))
其他一些说明:
-
我发现您的函数首先接受
max
参数然后是min
令人困惑。考虑改变这两个参数的顺序。 -
使用
NULL
作为min
和max
的初始值可能会导致问题,当您的树恰好具有等于NULL
的值(在大多数环境 0 将等于NULL
)。考虑分别使用INT_MIN
和INT_MAX
作为初始值,然后您还可以删除isBST
函数中的额外条件。