【JAVA】【刷题子】98. 验证二叉搜索树

146 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第11天,点击查看活动详情

一、题目与题目分析

题目

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

  • 节点的左子树只包含 小于 当前节点的数。
  • 节点的右子树只包含 大于 当前节点的数。
  • 所有左子树和右子树自身必须也是二叉搜索树。
    (题目来源:力扣:98. 验证二叉搜索树image.png

题目分析

和昨天写的那篇文章(450. 删除二叉搜索树中的节点)一样,需要先了解什么是二叉搜索树。(精准传送门
image.png
那么我们根据特征来实现就好了!

二、整体逻辑与主要代码

题目分析已经比较清楚了,接下来我们进入代码设计。

整体逻辑

① 先判断是否为空(空的也算二叉搜索树的),这里同时也可以放到递归里。
② 需要检查当前节点的左右边是否超出最小(左边判断)和最大(右边判断)值的范围。

主要代码

整体逻辑清晰了之后,同时也有较清楚的注释。直接来看代码吧! (如有不懂的或者更好的建议,欢迎评论区分享友友的看法哈~)

	public static boolean isValidBST(TreeNode root) {
		// 最值上下限范围
		long leftFirst = Long.MIN_VALUE;
		long rightFirst =  Long.MAX_VALUE;
		return checkValid(root, leftFirst, rightFirst);
	}

	public static boolean checkValid(TreeNode node, long leftMin, long rightMax) {
		// 节点为空,也属于二叉搜索树
		if (node == null) {
			return true;
		}
        // 当前节点的值大于最大值,小于最小值返回false
		if (node.val >= rightMax || node.val <= leftMin) {
			return false;
		}

		// 递归,继续往下查
		if (!checkValid(node.left, leftMin, node.val)) {
			// 检查左边
			return false;
		}
		if (!checkValid(node.right, node.val, rightMax)) {
			// 检查右边
			return false;
		}
		// 其实,也可以写为一条return;写成这样是为了看得更清晰一些
		// return checkValid(node.left, leftMin, node.val) && checkValid(node.right, node.val, rightMax);
		return true;
	}

三、结果展示

image.png

四、总结唠一唠

  说一下为什么有时候写的题是每日一题,有时候并不是每日一题;因为有些每日一题比较难,就会重新去挑一些没做过的题来;同时,笔者写文章也是提前一天来进行写的。因此,也会和每日一题错开来了~
  总结一下,今天这个就比较简单。但是解决困难,都是从简单的事情重复做,才能解决困难的事情!先学会爬,我们再学会跑,再去追赶!加油!

题目数据库

Gitee:传送门

文章小尾巴

文章写作、模板、文章小尾巴可参考:《写作“小心思”》
  感谢你看到最后,最后再说两点~
  ①如果你持有不同的看法,欢迎你在文章下方进行留言、评论。
  ②如果对你有帮助,或者你认可的话,欢迎给个小点赞,支持一下~
  我是南方者,一个热爱计算机更热爱祖国的南方人。

  (文章内容仅供学习参考,如有侵权,非常抱歉,请立即联系作者删除。)