leetcode98.验证搜索二叉树

题目大意

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

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

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

输入:
    2
   / \
  1   3
输出: true

解题思路

假设当前根节点root,要想让root是搜索二叉树,必须root的左子树和右子树是搜索二叉树,且root要大于左子树最大值(如果存在),root要小于右子树的最小值(如果存在)。
反过来说,必须满足root左子树中所有点均小于root,右子树中所有点均大于root。
假设root的值可以任意取,在判断root左子树时,root左子树的上界是root->val,左子树中任何值必须小于该值。在判断root右子树时,root右子树的下界是root->val,右子树中任何值必须大于该值。

class Solution {
public:
    bool isValidBST(TreeNode* root) {
    	// 表示当前子树中取值的上下界是MIN和MAX;
        return judge(root, LONG_MIN, LONG_MAX);
    }

    bool judge(TreeNode * root, long leftMax, long rightMin){
    	if (!root){
    		return true;
    	}
		// 如果当前节点的值在上下界范围外,则不是搜索二叉树
    	if (root->val <= leftMax || root->val >= rightMin){
    		return false;
    	}
		// 判断左子树和右子树
		// 判断左右子树的时候,上下界发生变动
		// 左子树上界是root,右子树下界是root
    	return judge(root->left, leftMax, root->val) && judge(root->right, root->val, rightMin);
    }
};
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值