题目描述
给你一个二叉树的根节点
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
解题思路
要判断一个二叉树是否是一个有效的二叉搜索树(BST),可以利用 BST 的性质进行递归检查:
-
定义:
左子树的所有节点的值都必须小于当前节点的值;右子树的所有节点的值都必须大于当前节点的值;每个子树也必须是 BST。 -
递归方法:
在递归中,维护一个有效的值范围(min
和max
),用于确保每个节点的值都在正确的范围内;对于每个节点,检查其值是否在给定的范围内,然后递归检查其左子树和右子树,更新有效值范围。
复杂度分析
- 时间复杂度:
O(n)
,其中n
是树的节点数。每个节点会被访问一次。 - 空间复杂度:
O(h)
,其中h
是树的高度。递归栈的空间复杂度为树的高度。
代码实现
package org.zyf.javabasic.letcode.hot100.tree;
import org.zyf.javabasic.letcode.tree.base.TreeNode;
/**
* @program: zyfboot-javabasic
* @description: 验证二叉搜索树(中等)
* @author: zhangyanfeng
* @create: 2024-08-22 11:42
**/
public class IsValidBSTSolution {
public boolean isValidBST(TreeNode root) {
return isValidBSTHelper(root, Long.MIN_VALUE, Long.MAX_VALUE);
}
private boolean isValidBSTHelper(TreeNode node, long min, long max) {
if (node == null) {
return true;
}
// Check current node value
if (node.val <= min || node.val >= max) {
return false;
}
// Recursively check left and right subtrees
return isValidBSTHelper(node.left, min, node.val) &&
isValidBSTHelper(node.right, node.val, max);
}
public static void main(String[] args) {
IsValidBSTSolution solution = new IsValidBSTSolution();
// Example 1
TreeNode root1 = new TreeNode(2);
root1.left = new TreeNode(1);
root1.right = new TreeNode(3);
System.out.println(solution.isValidBST(root1)); // Output: true
// Example 2
TreeNode root2 = new TreeNode(5);
root2.left = new TreeNode(1);
root2.right = new TreeNode(4);
root2.right.left = new TreeNode(3);
root2.right.right = new TreeNode(6);
System.out.println(solution.isValidBST(root2)); // Output: false
}
}