98. 验证二叉搜索树

给定一个二叉树,判断其是否是一个有效的二叉搜索树。

假设一个二叉搜索树具有如下特征:

    节点的左子树只包含小于当前节点的数。
    节点的右子树只包含大于当前节点的数。
    所有左子树和右子树自身必须也是二叉搜索树。

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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值