【二叉树】Leetcode 98. 验证二叉搜索树【中等】

news2025/1/11 18:40:10

验证二叉搜索树

给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。

有效 二叉搜索树定义如下:

  • 节点的左子树
  • 只包含 小于 当前节点的数。
  • 节点的右子树只包含 大于 当前节点的数。
  • 所有左子树和右子树自身必须也是二叉搜索树。

示例1:
在这里插入图片描述
输入:root = [2,1,3]
输出:true

示例2:
在这里插入图片描述
输入:root = [5,1,4,null,null,3,6]
输出:false
解释:根节点的值是 5 ,但是右子节点的值是 4

解题思路1

判断一个二叉树是否是有效的二叉搜索树,可以通过中序遍历的方式来检查节点值是否按照升序排列。

  • 1、进行中序遍历二叉树,递归地遍历左子树、当前节点、右子树。
  • 2、在遍历过程中,记录上一个节点的值prev,初始值为负无穷。
  • 3、每次访问一个节点时,比较当前节点的值与prev的值,如果当前节点的值小于等于prev的值,则二叉树不是有效的二叉搜索树。
  • 4、更新prev的值为当前节点的值。
  • 5、递归遍历左右子树,直到所有节点都遍历完毕

java实现1

public class IsValidBST {

    static class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;
        TreeNode(int val) {
            this.val = val;
        }
    }
    
    TreeNode prev = null;
    
    public boolean isValidBST(TreeNode root) {

        return isValidBSTHelper(root);
    }

    private boolean isValidBSTHelper(TreeNode root) {
        if (root == null) {
            return true;
        }

        // 判断左子树
        if (!isValidBSTHelper(root.left)) {
            return false;
        }

        // 当前节点值与前一个节点值比较
        if (prev != null && root.val <= prev.val) {
            return false;
        }
        prev = root;

        // 判断右子树
        return isValidBSTHelper(root.right);
    }

   

    // 测试示例
    public static void main(String[] args) {
        IsValidBST validator = new IsValidBST();

        // 构造一个有效的二叉搜索树
        //    4
        //   / \
        //  2   5
        // /   / \
        // 1   3  6
//        TreeNode root = new TreeNode(4);
//        root.left = new TreeNode(2);
//        root.right = new TreeNode(5);
//        root.left.left = new TreeNode(1);
//        root.right.left = new TreeNode(3);
//        root.right.right = new TreeNode(6);
//        // 判断是否是有效的二叉搜索树
//        boolean isValid = validator.isValidBST(root);
//        System.out.println("Is the tree a valid BST? " + isValid);

        //    5
        //   / \
        //  2   7
        // / \ / \
        // 1 3 6  8
        //    \
        //     4
        TreeNode root2 = new TreeNode(5);
        root2.left = new TreeNode(2);
        root2.right = new TreeNode(7);
        root2.left.left = new TreeNode(1);
        root2.left.right = new TreeNode(3);
        root2.right.right = new TreeNode(4);
        root2.right.left = new TreeNode(6);
        root2.right.right = new TreeNode(8);
        boolean isValid2 = validator.isValidBST(root2);
        System.out.println("Is the tree a valid BST? " + isValid2);
    }
}

解题思路2

使用递归的思路来判断是否是有效的二叉搜索树。

  • 1、对于每个节点,都有一个取值范围(上界和下界),它的左子树节点的值应该在当前节点值的下界到当前节点值之间,而右子树节点的值应该在当前节点值到上界之间。
  • 2、初始时,根节点的取值范围是负无穷到正无穷。在递归过程中,
  • 不断地更新每个节点的取值范围,并判断其左右子树是否符合要求。
  • 3、如果左右子树都符合,那么当前节点是有效的。在递归的过程中,
  • 如果某个节点的值超出了取值范围,则说明不是有效的二叉搜索树。

Java实现2

public class IsValidBST {

    static class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;
        TreeNode(int val) {
            this.val = val;
        }
    }

    public boolean isValidBST(TreeNode root) {

        return isValidBST(root, Long.MIN_VALUE, Long.MAX_VALUE);
    }

    private boolean isValidBST(TreeNode node, long lower, long upper) {
        if (node == null) {
            return true;
        }
        //    7
        //   / \
        //  3   9
        // / \ / \
        // 1 5 8  10
        //  / \
        //  4  6
        if (node.val <= lower || node.val >= upper) {
            return false;
        }

        return isValidBST(node.left, lower, node.val) && isValidBST(node.right, node.val, upper);
    }

    // 测试示例
    public static void main(String[] args) {
        IsValidBST validator = new IsValidBST();

        // 构造一个有效的二叉搜索树
        //    4
        //   / \
        //  2   5
        // /   / \
        // 1   3  6
//        TreeNode root = new TreeNode(4);
//        root.left = new TreeNode(2);
//        root.right = new TreeNode(5);
//        root.left.left = new TreeNode(1);
//        root.right.left = new TreeNode(3);
//        root.right.right = new TreeNode(6);
//        // 判断是否是有效的二叉搜索树
//        boolean isValid = validator.isValidBST(root);
//        System.out.println("Is the tree a valid BST? " + isValid);

        //    5
        //   / \
        //  2   7
        // / \ / \
        // 1 3 6  8
        //    \
        //     4
        TreeNode root2 = new TreeNode(5);
        root2.left = new TreeNode(2);
        root2.right = new TreeNode(7);
        root2.left.left = new TreeNode(1);
        root2.left.right = new TreeNode(3);
        root2.right.right = new TreeNode(4);
        root2.right.left = new TreeNode(6);
        root2.right.right = new TreeNode(8);
        boolean isValid2 = validator.isValidBST(root2);
        System.out.println("Is the tree a valid BST? " + isValid2);
    }
}

时间空间复杂度

  • 时间复杂度:O(n),其中n是二叉树中的节点数,每个节点都需要访问一次。
  • 空间复杂度:O(height),递归调用栈的深度为树的高度

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1552639.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

理想汽车推出首个全自研大模型Mind GPT,通过国家备案正式上线

理想汽车在今日宣布&#xff0c;其全自研的多模态认知大模型——Mind GPT&#xff0c;已正式通过国家《生成式人工智能服务管理暂行办法》的备案&#xff0c;并成功上线&#xff0c;标志着理想成为首个拥有自研大模型并通过国家备案的汽车厂商。 理想Mind GPT是汽车行业首个专门…

Python图像处理——计算机视觉中常用的图像预处理

概述 在计算机视觉项目中&#xff0c;使用样本时经常会遇到图像样本不统一的问题&#xff0c;比如图像质量&#xff0c;并非所有的图像都具有相同的质量水平。在开始训练模型或运行算法之前&#xff0c;通常需要对图像进行预处理&#xff0c;以确保获得最佳的结果。图像预处理…

MySQL索引18连问,谁能顶住

前言 过完这个节&#xff0c;就要进入金银季&#xff0c;准备了 18 道 MySQL 索引题&#xff0c;一定用得上。 作者&#xff1a;感谢每一个支持&#xff1a; github 1. 索引是什么 索引是一种数据结构&#xff0c;用来帮助提升查询和检索数据速度。可以理解为一本书的目录&…

linux离线安装jenkins及使用教程

本教程采用jenkins.war的方式离线安装部署&#xff0c;在线下载的方式会遇到诸多问题&#xff0c;不宜采用 一、下载地址 地址&#xff1a;Jenkins download and deployment 下载最新的长期支持版 由于jenkins使用java开发的&#xff0c;所以需要安装的linux服务器装有jdk环…

centos node puppeteer chrome报错问题

原因&#xff1a;缺少谷歌依赖包&#xff0c;安装以下即可 yum install atkyum install pango.x86_64 libXcomposite.x86_64 libXcursor.x86_64 libXdamage.x86_64 libXext.x86_64 libXi.x86_64 libXtst.x86_64 cups-libs.x86_64 libXScrnSaver.x86_64 libXrandr.x86_64 GConf…

uni-app(使用阿里图标)

1.注册阿里矢量图标库 注册阿里图标库账号并登录&#xff0c;https://www.iconfont.cn/ 2.加入购物车 搜索适合自己的图标&#xff0c;加入购物车&#xff0c;如下图&#xff1a; 3.加入项目 我的->资源管理->我的项目->创建项目&#xff0c;然后返回购物车&#…

【电路笔记】-交流电路波形的形状因子

波形的形状因子 文章目录 波形的形状因子1、概述2、正弦波波形因子3、波形因子示例14、波形因子示例25、单相半波整流波形6、单相全波整流波形7、三角波形形状因子8、锯齿波形因子9、方波和脉冲波形10、总结波形因子描述波形的形状或结构,是其均方根值与其平均值的比率。 1、概…

ZK友好代数哈希函数安全倡议

1. 引言 前序博客&#xff1a; ZKP中的哈希函数如何选择ZK-friendly 哈希函数&#xff1f;snark/stark-friendly hash函数Anemoi Permutation和Jive Compression模式&#xff1a;高效的ZK友好的哈希函数Tip5&#xff1a;针对Recursive STARK的哈希函数 随着Incrementally Ve…

【数据可视化】Echarts的高级功能

个人主页 &#xff1a; zxctscl 如有转载请先通知 文章目录 1. ECharts的图表混搭及多图表联动1.1 ECharts的图表混搭1.2 ECharts的多图表联动 2. 动态切换主题及自定义ECharts主题2.1 ECharts 4.x/5.x中动态切换主题2.2 自定义ECharts主题 3. ECharts中的事件和行为3.1 EChart…

基于springboot+vue+Mysql的财务管理系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

抓包工具和PyExeJs模块

文章目录 1. Fiddler1. 安装2. 使用1. 替换JS代码2. 其他使用 2. PyExecJS模块 1. Fiddler 1. 安装 点击下载 点击安装即可 2. 使用 配置https权限 1. 替换JS代码 devtool F12弹窗将script中src链接的JS文件替换成空的文件 2. 其他使用 2. PyExecJS模块

软件杯 深度学习+python+opencv实现动物识别 - 图像识别

文章目录 0 前言1 课题背景2 实现效果3 卷积神经网络3.1卷积层3.2 池化层3.3 激活函数&#xff1a;3.4 全连接层3.5 使用tensorflow中keras模块实现卷积神经网络 4 inception_v3网络5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; *…

计算机网络-RIP动态路由协议简介

一、概述 前面我们学习了动态路由协议按照工作机制及算法划分可以分为&#xff1a;距离矢量路由协议DV型和链路状态路由协议LS型。RIP就是典型的距离矢量路由协议&#xff0c;但是实际工作中用得已经比较少了。 距离矢量路由协议DV: RIP 链路状态路由协议LS: OSPF IS-IS 二、RI…

基于Spring boot + Vue协同过滤算法的电影推荐系统

末尾获取源码作者介绍&#xff1a;大家好&#xff0c;我是墨韵&#xff0c;本人4年开发经验&#xff0c;专注定制项目开发 更多项目&#xff1a;CSDN主页YAML墨韵 学如逆水行舟&#xff0c;不进则退。学习如赶路&#xff0c;不能慢一步。 目录 一、项目简介 二、开发技术与环…

每日一题--最长连续序列

洛阳春-岑参 人到洛阳花似锦&#xff0c;偏我来时不逢春。 谁道三冬无春色&#xff0c;冰山高处万里银 目录 题目描述 思路分析 方法及其时间复杂度 法一 暴力枚举&#xff1a; 法二 哈希表遍历&#xff1a; 法三 并查集&#xff1a; 个人总结 题目描述 128. 最长连续序…

使用pytorch构建一个无监督的深度卷积GAN网络模型

本文为此系列的第二篇DCGAN&#xff0c;上一篇为初级的GAN。普通GAN有训练不稳定、容易陷入局部最优等问题&#xff0c;DCGAN相对于普通GAN的优点是能够生成更加逼真、清晰的图像。 因为DCGAN是在GAN的基础上的改造&#xff0c;所以本篇只针对GAN的改造点进行讲解&#xff0c;其…

Day53:WEB攻防-XSS跨站SVGPDFFlashMXSSUXSS配合上传文件添加脚本

目录 MXSS UXSS&#xff1a;Universal Cross-Site Scripting HTML&SVG&PDF&SWF-XSS&上传&反编译(有几率碰到) SVG-XSS PDF-XSS Python生成XSS Flash-XSS 知识点&#xff1a; 1、XSS跨站-MXSS&UXSS 2、XSS跨站-SVG制作&配合上传 3、XSS跨站-…

第18次修改了可删除可持久保存的前端html备忘录

第17次修改了可删除可持久保存的前端html备忘录&#xff1a;增加年月日星期&#xff0c;增加倒计时&#xff0c;更改保存区名称可以多个备忘录保存不一样的信息&#xff0c;匹配背景主题&#xff1a;现代深色 <!DOCTYPE html> <html lang"zh"> <head&…

Radio Silence for mac 好用的防火墙软件

Radio Silence for Mac是一款功能强大的网络防火墙软件&#xff0c;专为Mac用户设计&#xff0c;旨在保护用户的隐私和网络安全。它具备实时网络监视和控制功能&#xff0c;可以精确显示每个网络连接的状态&#xff0c;让用户轻松掌握网络活动情况。 软件下载&#xff1a;Radio…

低功耗、低成本 NAS/公共文件夹 的可能性

使用现状&#xff1a;多台工作电脑&#xff0c;家里人手一台&#xff0c;还在两个住处 有好几台工作电脑&#xff0c;不同电脑不同OS有不同的用途&#xff0c;最大的问题就是各个电脑上文件的同步问题&#xff0c;这里当然就需要局域网里的公共文件夹&#xff0c;在NAS的问题上…