1. 题目
给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。
有效 二叉搜索树定义如下:
- 节点的左子树只包含 严格小于 当前节点的数。
- 节点的右子树只包含 严格大于 当前节点的数。
- 所有左子树和右子树自身必须也是二叉搜索树。
示例 1:
输入:root = [2,1,3]
输出:true
示例 2:
输入:root = [5,1,4,null,null,3,6]
输出:false
解释:根节点的值是 5 ,但是右子节点的值是 4 。
2. 题解
java
/**
* 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);
}
private boolean isValidBST(TreeNode node, long left, long right) {
if (node == null) {
return true;
}
long x = node.val;
return left < x && x < right &&
isValidBST(node.left, left, x) &&
isValidBST(node.right, x, right);
}
}
3. 解析
出自:【视频】前序中序后序,三种方法,一个视频讲透!(Python/Java/C++/C/Go/JS/Rust)
-
TreeNode 是一个用于描述二叉树节点的类,它包含三个属性:val(值), left(左子节点)和right(右子节点)。这个类的构造函数允许你创建一个新的TreeNode对象并设置它的属性。
-
Solution 是一个解决BST相关问题的类。其中,sortedArrayToBST方法是将已排序的数组转换为二叉搜索树(Binary Search Tree)的方法。它使用了深度优先遍历(DFS)和分治法(Divide and Conquer)策略。
-
sortedArrayToBST(int[] nums): 这个方法接收一个整型数组作为输入,返回一个对应的二叉搜索树。
-
a. dfs方法:这是一个私有方法,用于递归地构建二叉搜索树。它首先检查当前子集是否为空(即lo > hi),如果是,则返回null来结束递归。然后计算中间索引mid,并创建一个新的TreeNode,它的值是nums[mid]。左子节点和右子节点的构建分别使用了dfs(nums, lo, mid - 1)和dfs(nums, mid + 1, hi)进行递归调用。
-
isValidBST: 这个方法用来检查一个二叉树是否是有效的二叉搜索树(Binary Search Tree)。它接收一个TreeNode类型的参数root,并返回一个布尔值结果。
-
a. isValidBST(TreeNode node, long left, long right): 这是一个私有方法,用于递归地检查每个节点是否满足二叉搜索树的规定。它首先检查当前节点是否为null(即node == null),如果是,则返回true来结束递归。然后将当前节点的值x与范围left和right进行比较,如果x不在这个范围内,或者左子树或右子树不是有效的二叉搜索树(通过isValidBST的递归调用来确定),那么就返回false。