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。

相关推荐
WHS-_-20222 分钟前
A Density Clustering-Based CFAR Algorithm for Ship Detection in SAR Images
算法·5g
wuqingshun3141591 小时前
蓝桥杯 填字母游戏
游戏·职场和发展·蓝桥杯
Miraitowa_cheems2 小时前
LeetCode算法日记 - Day 68: 猜数字大小II、矩阵中的最长递增路径
数据结构·算法·leetcode·职场和发展·贪心算法·矩阵·深度优先
灵感__idea4 小时前
Hello 算法:让前端人真正理解算法
前端·javascript·算法
学习2年半5 小时前
小米笔试题:一元一次方程求解
算法
MATLAB代码顾问5 小时前
MATLAB绘制多种混沌系统
人工智能·算法·matlab
极客BIM工作室6 小时前
演化搜索与群集智能:五种经典算法探秘
人工智能·算法·机器学习
qq_574656256 小时前
java-代码随想录第66天|Floyd 算法、A * 算法精讲 (A star算法)
java·算法·leetcode·图论
金融街小单纯7 小时前
从蓝军建设中学习颠覆性质疑思维
人工智能·算法·机器学习
测试老哥7 小时前
如何编写好测试用例?
自动化测试·软件测试·python·功能测试·测试工具·职场和发展·测试用例