大家好!我是曾续缘😘
今天是《LeetCode 热题 100》系列
发车第 43 天
二叉树第 8 题
❤️点赞 👍 收藏 ⭐再看,养成习惯
验证二叉搜索树 给你一个二叉树的根节点
root
,判断其是否是一个有效的二叉搜索树。有效 二叉搜索树定义如下:
- 节点的左子树只包含 小于 当前节点的数。
- 节点的右子树只包含 大于 当前节点的数。
- 所有左子树和右子树自身必须也是二叉搜索树。
示例 1:
输入:root = [2,1,3] 输出:true示例 2:
输入:root = [5,1,4,null,null,3,6] 输出:false 解释:根节点的值是 5 ,但是右子节点的值是 4 。提示:
难度:💖💖
- 树中节点数目范围在
[1, 104]
内-231 <= Node.val <= 231 - 1
解题方法
这道问题涉及验证给定二叉树是否为有效的二叉搜索树,满足左子节点值小于当前节点值,右子节点值大于当前节点值,并且左右子树也为二叉搜索树。
我们希望通过递归方式判断每个节点是否符合二叉搜索树的条件。
如何判断每个节点是否满足二叉搜索树的条件?
我们采用范围排除法,起始范围设定为(Long.MIN_VALUE, Long.MAX_VALUE)
,表示第一个节点取值无限制。在遍历二叉树时,维护节点值允许范围的区间(最小值和最大值),逐步缩小范围以确保节点值在合理范围内。
具体而言,对于每个节点,需验证其值是否在允许范围内。若节点值小于最小值或大于最大值,则不符合二叉搜索树条件,返回false
;否则,继续递归验证左右子节点。
针对左子节点,其值应小于当前节点值,故更新最大值为当前节点值,继续验证左子树。右子节点值应大于当前节点值,更新最小值为当前节点值,继续验证右子树。
通过不断缩小范围并递归验证,可确保每个节点符合二叉搜索树条件。当达到叶子节点时,返回true
,因为空节点符合二叉搜索树条件。
Code
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public boolean isValidBST(TreeNode root) {
return isValidBST(root, Long.MIN_VALUE, Long.MAX_VALUE);
}
public boolean isValidBST(TreeNode root, long mn, long mx){
if(root == null){
return true;
}
if(root.val <= mn || root.val >= mx){
return false;
}
return isValidBST(root.left, mn, root.val) && isValidBST(root.right, root.val, mx);
}
}