LeetCode热题100--98. 验证二叉搜索树--中等

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)

  1. TreeNode 是一个用于描述二叉树节点的类,它包含三个属性:val(值), left(左子节点)和right(右子节点)。这个类的构造函数允许你创建一个新的TreeNode对象并设置它的属性。

  2. 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。

相关推荐
会员源码网8 小时前
使用`mysql_*`废弃函数(PHP7+完全移除,导致代码无法运行)
后端·算法
木心月转码ing9 小时前
Hot100-Day10-T438T438找到字符串中所有字母异位词
算法
HelloReader10 小时前
Wi-Fi CSI 感知技术用无线信号“看见“室内的人
算法
颜酱13 小时前
二叉树分解问题思路解题模式
javascript·后端·算法
qianpeng89714 小时前
水声匹配场定位原理及实验
算法
董董灿是个攻城狮1 天前
AI视觉连载8:传统 CV 之边缘检测
算法
AI软著研究员1 天前
程序员必看:软著不是“面子工程”,是代码的“法律保险”
算法
FunnySaltyFish1 天前
什么?Compose 把 GapBuffer 换成了 LinkBuffer?
算法·kotlin·android jetpack
颜酱1 天前
理解二叉树最近公共祖先(LCA):从基础到变种解析
javascript·后端·算法
地平线开发者2 天前
SparseDrive 模型导出与性能优化实战
算法·自动驾驶