LeetCode 98. 验证二叉搜索树

这篇具有很好参考价值的文章主要介绍了LeetCode 98. 验证二叉搜索树。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


LeetCode 98. 验证二叉搜索树,leetcode,算法,职场和发展

题目描述

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

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

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

示例 1:
​​​​LeetCode 98. 验证二叉搜索树,leetcode,算法,职场和发展
输入:root = [2,1,3] 输出:true

​示例 2:
LeetCode 98. 验证二叉搜索树,leetcode,算法,职场和发展
输入:root = [5,1,4,null,null,3,6] 输出:false 解释:根节点的值是 5 ,但是右子节点的值是 4 。
LeetCode 98. 验证二叉搜索树,leetcode,算法,职场和发展

题解

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

/**
 * 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);
}

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

LeetCode 98. 验证二叉搜索树,leetcode,算法,职场和发展

显示这段测试用例不能通过
该用例的图形表示如下
LeetCode 98. 验证二叉搜索树,leetcode,算法,职场和发展
很明显,我们并不能只判断左孩子,右孩子与当前节点的大小关系
在测试一个节点时我们应该规范,其左右孩子的取值范围
所以需要维护一个最大取值,和最小取值
因为题目给定的函数没有维护只两个变量,所以我们另外在写一个函数,再把该函数最终返回的值返回该原函数即可

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

现在我们再测试一次
LeetCode 98. 验证二叉搜索树,leetcode,算法,职场和发展
仍然解答错误
因为节点的值可能为边界值,

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

再次测试
LeetCode 98. 验证二叉搜索树,leetcode,算法,职场和发展
哈哈,这次我们总算通过了

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

附上原题链接:https://leetcode.cn/problems/validate-binary-search-tree/submissions/文章来源地址https://www.toymoban.com/news/detail-702933.html

到了这里,关于LeetCode 98. 验证二叉搜索树的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Leetcode98. 验证二叉搜索树

    力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 给你一个二叉树的根节点  root  ,判断其是否是一个有效的二叉搜索树。 有效  二叉搜索树定义如下: 节点的左子树只包含  小于  当前节点的数。 节点的右子树只包含  大于  当前节点的数。 所有左子树和右子树自身

    2024年02月11日
    浏览(32)
  • leetcode做题笔记98. 验证二叉搜索树

    给你一个二叉树的根节点  root  ,判断其是否是一个有效的二叉搜索树。 有效  二叉搜索树定义如下: 节点的左子树只包含  小于  当前节点的数。 节点的右子树只包含  大于  当前节点的数。 所有左子树和右子树自身必须也是二叉搜索树。 本题要判断二叉树是否为二叉

    2024年02月11日
    浏览(28)
  • leetcode每日一练-第98题- 验证二叉搜索树

        一、思路 因为要验证多个节点是否是二叉搜索树,因此使用 递归 二、解题方法 设计一个递归函数 helper(root, lower, upper) 来递归判断,函数表示考虑以 root 为根的子树,判断子树中所有节点的值是否都在 (l,r)的范围内(注意是开区间)。如果 root 节点的值 val 不在 (l,r)的范

    2024年02月15日
    浏览(37)
  • LeetCode98:验证二叉搜索树,居然有这么简单的中等难度,白捡(用时击败100%)

    这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 做这道题之前,我反复审题,最后确认:没错,不存在什么坑,这道题确实非常非常简单,然而却被官方定义为 中等 难度 这一定是送分,白捡一道中等难度题,接下来,一起来轻松愉快的享受解题

    2024年02月09日
    浏览(25)
  • Java算法_ 验证二叉搜索树(LeetCode_Hot100)

    题目描述: 给你一个二叉树的根节点 ,判断其是否是一个有效的二叉搜索树。root 有效 二叉搜索树定义如下: 节点的左子树只包含 小于 当前节点的数。 节点的右子树只包含 大于 当前节点的数。 所有左子树和右子树自身必须也是二叉搜索树。 获得更多?算法思路:代码文

    2024年02月12日
    浏览(28)
  • LeetCode刷题--- 验证二叉搜索树

    个人主页:元清加油_【C++】,【C语言】,【数据结构与算法】-CSDN博客 个人专栏:力扣递归算法题                    【C++】   前言:这个专栏主要讲述递归递归、搜索与回溯算法,所以下面题目主要也是这些算法做的   我讲述题目会把讲解部分分为3个部分: 1、题目解析

    2024年02月04日
    浏览(26)
  • 【leetcode100-042/043】【二叉树】二叉搜索树的转换和验证

    【转换】 给你一个整数数组  nums  ,其中元素已经按  升序  排列,请你将其转换为一棵  高度平衡  二叉搜索树。 高度平衡  二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。 思路: 可以说是递归板子题了。每次把数组切两半,中间

    2024年01月20日
    浏览(29)
  • 98. 验证二叉搜索树

    98. 验证二叉搜索树 https://leetcode.cn/problems/validate-binary-search-tree/ //保证按照规则来,往左边走就要,不能比当前值还大了;往右边走就要,不能比当前值还小了;

    2024年02月16日
    浏览(27)
  • 力扣 98. 验证二叉搜索树

    题目来源:https://leetcode.cn/problems/validate-binary-search-tree/description/    C++题解1:中序遍历,递归法。获取数组,如果是递增则返回true,否则返回false。 C++题解2:中序遍历,递归法。不断更新最大值,初始化为最左最下层的节点值,按照中序遍历可以更新为上一节点的值。 C+

    2024年02月12日
    浏览(29)
  • LeetCode算法题解(动态规划)|LeetCode343. 整数拆分、LeetCode96. 不同的二叉搜索树

    题目链接:343. 整数拆分 题目描述: 给定一个正整数  n  ,将其拆分为  k  个  正整数  的和(  k = 2  ),并使这些整数的乘积最大化。 返回  你可以获得的最大乘积  。 示例 1: 示例 2: 提示: 2 = n = 58 算法分析: 定义dp数组及下标含义: dp[i]表述正整数i拆分成k个正整数

    2024年02月04日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包