我信心满满的写下这个代码。结果,测试用例[10,5,15,null,null,6,20]
教我做人。。。
可见二叉搜索树的递归中,子树是二叉搜索树,拼在一起就不一定是二叉搜索树了
class Solution {
public:
bool isValidBST(TreeNode* root) {
if( !root ) return true;
if( root->left ){
if( root->left->val >= root->val )
return false;
isValidBST(root->left);
}
if( root->right ){
if( root->right->val <= root->val )
return false;
isValidBST(root->right);
}
return true;
}
};
所以要在每次判断中多加上一个根结点的取值范围,看看是否满足整体的二叉搜索树的性质
class Solution {
private:
bool isValidBST(TreeNode* node, int min, int max){
if( !node )
return true;
if( node->val <= min || node->val >= max )
return false;
if( node->left != NULL && node->left->val >= node->val )
return false;
if( node->right != NULL && node->right->val <= node->val )
return false;
return isValidBST(node->left, min, node->val) && isValidBST(node->right, node->val, max);
}
public:
bool isValidBST(TreeNode* root) {
return isValidBST(root, INT_MIN, INT_MAX);
}
};
当我写完这个代码觉得万无一失的时候,测试用例[2147483647]
教育我,让我知道自己还是too young to simple,边界值卡的真的🤢,
所以我将代码中的int 改成了long
INT_MAX改成了LONG_MAX
INT_MIN改成了LONG_MIN强行通过了
第二种方法就是用中序遍历为升序来判断是否为二叉搜索树,还是这种方法优雅。。。
private:
vector<int> result;
void InOrder(TreeNode* root){
if( root ){
InOrder( root->left );
result.emplace_back( root->val );
InOrder( root->right );
}
}
public:
bool isValidBST(TreeNode* root) {
InOrder(root);
for(int i = 1 ; i < result.size() ; i ++)
if(result[i-1] >= result[i])
return false;
return true;
//在判断的时候想用下面这种优雅一点的方法,但是发现这个方法不可行
//vector<int> OldArray = result;
//sort( result.begin(), result.end() ); //不能这样 因为重复元素判断不出来
// return OldArray == result;
}