持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第11天,点击查看活动详情
一、题目与题目分析
题目
给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。
有效二叉搜索树定义如下:
- 节点的左子树只包含 小于 当前节点的数。
- 节点的右子树只包含 大于 当前节点的数。
- 所有左子树和右子树自身必须也是二叉搜索树。
(题目来源:力扣:98. 验证二叉搜索树)
题目分析
和昨天写的那篇文章(450. 删除二叉搜索树中的节点)一样,需要先了解什么是二叉搜索树。(精准传送门)
那么我们根据特征来实现就好了!
二、整体逻辑与主要代码
题目分析已经比较清楚了,接下来我们进入代码设计。
整体逻辑
① 先判断是否为空(空的也算二叉搜索树的),这里同时也可以放到递归里。
② 需要检查当前节点的左右边是否超出最小(左边判断)和最大(右边判断)值的范围。
主要代码
整体逻辑清晰了之后,同时也有较清楚的注释。直接来看代码吧! (如有不懂的或者更好的建议,欢迎评论区分享友友的看法哈~)
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;
}
三、结果展示
四、总结唠一唠
说一下为什么有时候写的题是每日一题,有时候并不是每日一题;因为有些每日一题比较难,就会重新去挑一些没做过的题来;同时,笔者写文章也是提前一天来进行写的。因此,也会和每日一题错开来了~
总结一下,今天这个就比较简单。但是解决困难,都是从简单的事情重复做,才能解决困难的事情!先学会爬,我们再学会跑,再去追赶!加油!
题目数据库
Gitee:传送门
文章小尾巴
文章写作、模板、文章小尾巴可参考:《写作“小心思”》
感谢你看到最后,最后再说两点~
①如果你持有不同的看法,欢迎你在文章下方进行留言、评论。
②如果对你有帮助,或者你认可的话,欢迎给个小点赞,支持一下~
我是南方者,一个热爱计算机更热爱祖国的南方人。
(文章内容仅供学习参考,如有侵权,非常抱歉,请立即联系作者删除。)