给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
节点的左子树只包含小于当前节点的数。
节点的右子树只包含大于当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。
1:
使用中序遍历,然后用一个全局变量记住前一个值,用当前的值和前一个值比较:
long long last;
bool isValidBST_r(struct TreeNode* root);
bool isValidBST(struct TreeNode* root){
last = -((long long)1 << 32);
return isValidBST_r(root);
}
bool isValidBST_r(struct TreeNode* root){
if(root)
{
if(!isValidBST_r(root->left))
{
return false;
}
if( root->val <= last)
{
return false;
}
last = root->val;
if(!isValidBST_r(root->right))
{
return false;
}
}
return true;
}
2.不使用全局变量,使用函数参数传递:
bool isValidBST_r(struct TreeNode *root, long long *last)
{
if(!root)
{
return true;
}
if(!isValidBST_r(root->left, last ))
{
return false;
}
if(root->val <= *last)
{
return false;
}
*last = root->val;
if(!isValidBST_r(root->right, last ))
{
return false;
}
return true;
}
bool isValidBST(struct TreeNode* root){
long long last = -((long long)1 << 32);
return isValidBST_r(root, &last);
}
3.使用最大值,最小值两个参数:
bool isValidBST_r(struct TreeNode *root, long long min, long long max)
{
if(!root)
{
return true;
}
if(!isValidBST_r(root->left, min, root->val ))
{
return false;
}
if( root->val <= min || max <= root->val)
{
return false;
}
if(!isValidBST_r(root->right, root->val, max ))
{
return false;
}
return true;
}
bool isValidBST(struct TreeNode* root){
return isValidBST_r(root, -((long long)1 << 32), (long long)1 << 32);
}
4. 使用stack、
struct TreeNode * mystack[1024 * 1024];
int stacksize;
int top;
bool isValidBST(struct TreeNode* root){
top = -1;
stacksize = 0;
long long last = -((long long)1 << 32);
while(stacksize > 0 || root != NULL)
{
while(root)
{
mystack[++top] = root;
root = root->left;
++stacksize;
}
root = mystack[top--];
--stacksize;
if(root->val <= last)
{
return false;
}
last = root->val;
root = root->right;
}
return true;
}