98. 验证二叉搜索树(java)

news2024/12/20 19:41:55

题目描述:

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

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

  • 节点的左

    子树

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

示例 1:

输入:root = [2,1,3]
输出:true

示例 2:

输入:root = [5,1,4,null,null,3,6]
输出:false
解释:根节点的值是 5 ,但是右子节点的值是 4 。

代码思路:

/**
 * 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 {
    /**
     * 主方法,检查二叉树是否是有效的二叉搜索树。
     * @param root 二叉树的根节点
     * @return 如果是有效的二叉搜索树返回true,否则返回false
     */
    public boolean isValidBST(TreeNode root) {
        int x = judge(root);  // 调用judge方法检查树是否合法
        if(x > 0){  // 如果judge方法返回值大于0,表示树不合法
            return false;
        } else {
            return true;  // 否则树合法
        }
    }

    /**
     * 辅助方法,用于判断以当前节点为根的子树是否符合二叉搜索树的性质。
     * 二叉搜索树要求:
     * 1. 左子树所有节点的值都小于根节点的值
     * 2. 右子树所有节点的值都大于根节点的值
     * 3. 左右子树都是二叉搜索树
     * 
     * @param root 当前节点
     * @return 0 表示合法,1 表示不合法
     */
    public int judge(TreeNode root){
        int flag = 0;  // 默认合法
        // 如果是叶子节点,直接返回合法
        if(root.left == null && root.right == null){
            return 0;
        }

        // 处理只有右子树的情况
        if(root.left == null && root.right != null){
            // 如果右子树的最小值小于等于根节点值,返回不合法
            if(root.right.val <= root.val){
                return 1;
            }
            // 找到右子树的最小值
            TreeNode rl = root.right;
            while(rl.left != null){
                rl = rl.left;
            }
            // 如果右子树的最小值小于等于根节点值,返回不合法
            if(rl.val <= root.val){
                return 1;
            }
            // 递归检查右子树是否合法
            flag = judge(root.right);
        }

        // 处理只有左子树的情况
        if(root.left != null && root.right == null){
            // 如果左子树的最大值大于等于根节点值,返回不合法
            if(root.left.val >= root.val){
                return 1;
            }
            // 找到左子树的最大值
            TreeNode lr = root.left;
            while(lr.right != null){
                lr = lr.right;
            }
            // 如果左子树的最大值大于等于根节点值,返回不合法
            if(lr.val >= root.val){
                return 1;
            }
            // 递归检查左子树是否合法
            flag = judge(root.left);
        }

        // 处理同时有左子树和右子树的情况
        if(root.left != null && root.right != null){
            // 如果左子树的最大值大于等于根节点值,或者右子树的最小值小于等于根节点值,返回不合法
            if(root.left.val >= root.val || root.right.val <= root.val){
                return 1;
            }
            // 找到右子树的最小值
            TreeNode rl = root.right;
            while(rl.left != null){
                rl = rl.left;
            }
            // 如果右子树的最小值小于等于根节点值,返回不合法
            if(rl.val <= root.val){
                return 1;
            }
            // 找到左子树的最大值
            TreeNode lr = root.left;
            while(lr.right != null){
                lr = lr.right;
            }
            // 如果左子树的最大值大于等于根节点值,返回不合法
            if(lr.val >= root.val){
                return 1;
            }
            // 递归检查左右子树是否合法
            flag = judge(root.left) + judge(root.right);
        }

        return flag;  // 返回0表示合法,返回1表示不合法
    }
}

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

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

相关文章

微软 Phi-4:小型模型的推理能力大突破

在人工智能领域&#xff0c;语言模型的发展日新月异。微软作为行业的重要参与者&#xff0c;一直致力于推动语言模型技术的进步。近日&#xff0c;微软推出了最新的小型语言模型 Phi-4&#xff0c;这款模型以其卓越的复杂推理能力和在数学领域的出色表现&#xff0c;引起了广泛…

libaom 源码分析:熵编码模块介绍

AV1 熵编码原理介绍 关于AV1 熵编码原理介绍可以参考:AV1 编码标准熵编码技术概述libaom 熵编码相关源码介绍 函数流程图 核心函数介绍 av1_pack_bitstream 函数:该函数负责将编码后的数据打包成符合 AV1 标准的比特流格式;包括写入序列头 OBU 的函数 av1_write_obu_header…

JAVA基于百度AI人脸识别签到考勤系统(开题报告+作品+论文)

博主介绍&#xff1a;黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者&#xff0c;CSDN博客专家&#xff0c;在线教育专家&#xff0c;CSDN钻石讲师&#xff1b;专注大学生毕业设计教育、辅导。 所有项目都配有从入门到精通的基础知识视频课程&#xff…

go 中使用redis 基础用法

1、安装redis 参考链接&#xff1a;https://www.codeleading.com/article/98554130215/ 1.1 查看是否有redis yum 源 yum install redis没有可用的软件包&#xff0c;执行1.2 1.2下载fedora的epel仓库 yum install epel-release --下载fedora的epel仓库1.3启动redis s…

postman添加cookie

点击cookies 输入域名&#xff0c;添加该域名下的cookies 发送改域名下的请求&#xff0c;cookie会自动追加上

简易记事本开发-(SSM+Vue)

目录 前言 一、项目需求分析 二、项目环境搭建 1.创建MavenWeb项目&#xff1a; 2.配置 Spring、SpringMVC 和 MyBatis SpringMVC 配置文件 (spring-mvc.xml)&#xff1a; 配置视图解析器、处理器映射器&#xff0c;配置了CORS&#xff08;跨源资源共享&#xff09;&#x…

vsCode 报错[vue/no-v-model-argument]e‘v-model‘ directives require no argument

在vue3中使用ui库中的组件语法v-model:value时会提示[vue/no-multiple-template-root]The template root requires exactly one element. 引入组件使用单标签时会提示[vue/no-multiple-template-root]“The template root requires exactly one element. 原因&#xff1a; 1.可…

初学stm32 -- SysTick定时器

以delay延时函数来介绍SysTick定时器的配置与使用 首先是delay_init()延时初始化函数&#xff0c;这个函数主要是去初始化SysTick定时器&#xff1b; void delay_init() {SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //选择外部时钟 HCLK/8fac_usSystemCoreCloc…

Gitlab 数据备份全攻略:命令、方法与注意事项

文章目录 1、备份命令2、备份目录名称说明3、手工备份配置文件3.1 备份配置文件3.2 备份ssh文件 4、备份注意事项4.1 停止puma和sicdekiq组件4.2 copy策略需要更多磁盘空间 5、数据备份方法5.1 docker命令备份5.2 kubectl命令备份5.3 参数说明5.4、选择性备份5.5、非tar备份5.6…

selenium工作原理

原文链接&#xff1a;https://blog.csdn.net/weixin_67603503/article/details/143226557 启动浏览器和绑定端口 当你创建一个 WebDriver 实例&#xff08;如 webdriver.Chrome()&#xff09;时&#xff0c;Selenium 会启动一个新的浏览器实例&#xff0c;并为其分配一个特定的…

Docker--Docker Registry(镜像仓库)

什么是Docker Registry&#xff1f; 镜像仓库&#xff08;Docker Registry&#xff09;是Docker生态系统中用于存储、管理和分发Docker镜像的关键组件。 镜像仓库主要负责存储Docker镜像&#xff0c;这些镜像包含了应用程序及其相关的依赖项和配置&#xff0c;是构建和运行Doc…

OpenEuler Linux上怎么测试Nvidia显卡安装情况

当安装好显卡驱动后怎么样知道驱动程序安装好了,这里以T400 OpenEuler 正常情况下,我们只要看一下nvidia-smi 状态就可以确定他已经正常了 如图: 这里就已经确定是可以正常使用了,这里只是没有运行对应的程序,那接来下我们就写一个测试程序来测试一下:以下代码通过AI给出然后…

【python虚拟环境安装】linux centos 下的python虚拟环境配置

linux centos 下的python虚拟环境配置 在 CentOS 环境中处理 pip 安装警告的方法1. 创建并使用虚拟环境2. 忽略警告并继续使用 root 用户安装&#xff08;不推荐&#xff09;报错问题处理 在 CentOS 环境中处理 pip 安装警告的方法 当在 CentOS 环境中遇到 pip 安装警告时&…

Excel根据身份证号,计算退休日期和剩余天数!

大家好&#xff0c;我是小鱼。 日常工作中&#xff0c;有时我们需要使用Excel表格统计男女员工退休日期或者退休剩余天数&#xff0c;很多新手小伙伴可能不知道如何下手。今天就跟大家分享一下WPS中的Excel表格数据如果根据身份证号&#xff0c;自动批量计算退休日期和剩余天数…

排序算法(3)——归并排序、计数排序

目录 1. 归并排序 1.1 递归实现 1.2 非递归实现 1.3 归并排序特性总结 2. 计数排序 代码实现 3. 总结 1. 归并排序 基本思想&#xff1a; 归并排序&#xff08;merge sort&#xff09;是建立在归并操作上的一种有效的排序算法&#xff0c;该算法是采用分治法&#xff0…

Electron-Vue 开发下 dev/prod/webpack server各种路径设置汇总

背景 在实际开发中&#xff0c;我发现团队对于这几个路径的设置上是纯靠猜的&#xff0c;通过一点点地尝试来找到可行的路径&#xff0c;这是不应该的&#xff0c;我们应该很清晰地了解这几个概念&#xff0c;以下通过截图和代码进行细节讲解。 npm run dev 下的路径如何处理&…

HTML零基础入门教学

目录 一. HTML语言 二. HTML结构 三. HTML文件基本结构 四. 准备开发环境 五. 快速生成代码框架 六. HTML常见标签 6.1 注释标签 6.2 标题标签&#xff1a;h1-h6 6.3 段落标签&#xff1a;p 6.4 换行标签&#xff1a;br 6.5 格式化标签 6.6 图片标签&a…

晶闸管-直流电动机调速系统设计【MATLAB源码+Word文档】

1.1.设计指标及要求 某双闭环直流调速系统采用晶闸管三相桥式整流电路供电&#xff0c;基本数据为:直流他励电动机&#xff0c; 设计要求主要技术指标&#xff1a; 1.2 目录 2. 硬件电路设计 3. 控制电路 4. MATLAB系统仿真 转速输出波形 硬件电路图 Word文档MATLAB仿真源…

Andriod Studio | 项目构建成功,依赖无报错的情况下,却无法启动App?

启动App时出现问题&#xff08;Error running app&#xff09;&#xff1a; &#xff08;1&#xff09; Emulator failed to connect within 5 minutes 原因&#xff1a;App(模拟器)超过5分钟未响应&#xff0c;连接失败 解决办法&#xff1a;可能是因为电脑磁盘不足&#…

UE5中实现Billboard公告板渲染

公告板&#xff08;Billboard&#xff09;通常指永远面向摄像机的面片&#xff0c;游戏中许多技术都基于公告板&#xff0c;例如提示拾取图标、敌人血槽信息等&#xff0c;本文将使用UE5和材质节点制作一个公告板。 Gif效果&#xff1a; 网格效果&#xff1a; 1.思路 通过…