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。

相关推荐
cynicme3 小时前
力扣3318——计算子数组的 x-sum I(偷懒版)
java·算法·leetcode
im_AMBER6 小时前
算法笔记 09
c语言·数据结构·c++·笔记·学习·算法·排序算法
凯芸呢6 小时前
Java中的数组(续)
java·开发语言·数据结构·算法·青少年编程·排序算法·idea
寂静山林6 小时前
UVa 1030 Image Is Everything
算法
AI柠檬6 小时前
几种排序算法的实现和性能比较
数据结构·算法·c#·排序算法
weixin_429630267 小时前
第6章 支持向量机
算法·机器学习·支持向量机
SweetCode7 小时前
C++ 实现大数加法
开发语言·c++·算法
王哈哈^_^7 小时前
【数据集】【YOLO】【目标检测】共享单车数据集,共享单车识别数据集 3596 张,YOLO自行车识别算法实战训推教程。
人工智能·算法·yolo·目标检测·计算机视觉·视觉检测·毕业设计
CodeWizard~8 小时前
AtCoder Beginner Contest 430赛后补题
c++·算法·图论