LeetCode 98. 验证二叉搜索树

文章目录


在这里插入图片描述

题目描述

给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。

有效 二叉搜索树定义如下:

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

示例 1:
​​​​在这里插入图片描述
输入:root = [2,1,3] 输出:true

​示例 2:
在这里插入图片描述
输入:root = [5,1,4,null,null,3,6] 输出:false 解释:根节点的值是 5 ,但是右子节点的值是 4 。
在这里插入图片描述

题解

此题并不难,我们只需要,按照遍历树的思路,在遍历时,测试当前节点与其左右节点的大小关系即可
用递归的方法很容易解决本题

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */

typedef struct TreeNode* TreeNode;

bool isValidBST (TreeNode root){
    if(!root) return true;
    
	//在左孩子不为空时,测试当前节点与左孩子的大小关系,如果不符合二叉查找树就返回false
    if(root->left && root->val <= root->left->val ) return false;
    
    //在右孩子不为空时,测试当前节点与右孩子的大小关系,如果不符合二叉查找树就返回false
    if(root->right && root->val >= root->right->val) return false;
    
	//当左右子树都满足二叉查找树时才返回true
    return isValidBST(root->left) && isValidBST(root->right);
}

但当用以上代码测试时,会抛出执行错误

在这里插入图片描述

显示这段测试用例不能通过
该用例的图形表示如下
在这里插入图片描述
很明显,我们并不能只判断左孩子,右孩子与当前节点的大小关系
在测试一个节点时我们应该规范,其左右孩子的取值范围
所以需要维护一个最大取值,和最小取值
因为题目给定的函数没有维护只两个变量,所以我们另外在写一个函数,再把该函数最终返回的值返回该原函数即可

typedef struct TreeNode* TreeNode;
bool isValid (TreeNode root,int min,int max) {
    if(!root) return true;
    
    if(root->left && root->val <= root->left->val && root->val <= min) return false;
    
    if(root->right && root->val >= root->right->val && root->val >= max) return false;

	//测试左子树,因为左子树的所有节点值都比当前节点小所以将最大值设置为当前节点
	//测试右子树,因为右子树的所有节点值都比当前节点大所以将最小值设置为当前节点
	//当左右子树都满足二叉查找树时才返回true
    return isValid(root->left,min,root->val) && isValid(root->right,root->val,max);
}

bool isValidBST (TreeNode root){
//根据题目描述中节点元素值的取值范围设置初始的最大值和最小值
    return isValid(root,-2147483648,2147483647);
}

现在我们再测试一次
在这里插入图片描述
仍然解答错误
因为节点的值可能为边界值,

if(root->left && root->val <= root->left->val && root->val <= min) return false;
if(root->right && root->val >= root->right->val && root->val >= max) return false;

而我们必须把测试范围时的条件设置为 <= 或 >= 以此来避免重复元素出现
所以需要把测试范围扩大
由于扩大测试范围扩大后将超出int所能表示的值 所以我们用 long 类型来经行参数传递

typedef struct TreeNode* TreeNode;

bool isValid (TreeNode root,long min,long max) {
    if(!root) return true;

    if(root->left && root->val <= root->left->val || root->val <= min) return false;
    if(root->right && root->val >= root->right->val || root->val >= max) return false;

    return isValid(root->left,min,root->val) && isValid(root->right,root->val,max);
}

bool isValidBST (TreeNode root){
	//扩大测试范围
    return isValid(root,-2147483649,2147483648);
}

再次测试
在这里插入图片描述
哈哈,这次我们总算通过了

好滴!本次分享到这就结束了
如果对铁汁你有帮助的话,记得点赞👍+收藏⭐️+关注➕
我在这先行拜谢了:)

附上原题链接:https://leetcode.cn/problems/validate-binary-search-tree/submissions/

  • 21
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 17
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值