【力扣题解】P98-验证二叉搜索树-Java题解

2024-01-01 13:20

本文主要是介绍【力扣题解】P98-验证二叉搜索树-Java题解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

花无缺

👨‍💻博客主页:@花无缺
欢迎 点赞👍 收藏⭐ 留言📝 加关注✅!
本文由 花无缺 原创

收录于专栏 【力扣题解】


文章目录

  • 【力扣题解】P98-验证二叉搜索树-Java题解
    • 🌏题目描述
    • 💡题解
    • 🌏总结


【力扣题解】P98-验证二叉搜索树-Java题解

P98.验证二叉搜索树

🌏题目描述

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

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

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

示例 1:

在这里插入图片描述

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

示例 2:

在这里插入图片描述

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

提示:

  • 树中节点数目范围在[1, 104]
  • -231 <= Node.val <= 231 - 1

💡题解

递归法1

// list 保存中序序列
List<Long> list = new ArrayList<>();
public boolean isValidBST(TreeNode root) {// 中序遍历二叉树, 将中序序列保存到 list 中dfs(root);// 遍历 list, 如果 list 是一个递增的序列, 那么这就是一棵二叉搜索树for (int i = 0; i < list.size() - 1; i++) {if (list.get(i) >= list.get(i + 1)) {return false;}}return true;
}
public void dfs(TreeNode root) {if (root == null) {return;}dfs(root.left);// 中序遍历, 将节点值放入 listlist.add((long) root.val);dfs(root.right);
}

递归法2

// pre 保存上一个遍历的节点值
long pre = Long.MIN_VALUE;
public boolean isValidBST2(TreeNode root) {// 空树也是二叉搜索树if (root == null) {return true;}// 递归判断左子树boolean left = isValidBST2(root.left);// 如果当前节点的值大于上一个遍历的节点值那么就是符合二叉搜索树的// 继续遍历if (root.val > pre) {pre = root.val;//     如果当前节点的值小于等于上一个遍历的节点值, 那么该树就不是二叉搜索树} else {return false;}// 递归判断右子树boolean right = isValidBST2(root.right);// 左右子树都是二叉搜索树return left && right;
}

时间复杂度均为O(n),需要遍历二叉树的所有节点,二叉树节点数为 n。

🌏总结

我们知道二叉搜索树的左子树的所有节点值一定小于根节点,右子树的所有节点值一定大于根节点,并且所有子树都是二叉搜索树,根据二叉树的这个特性,我们可以推出,二叉搜索树的中序序列一定是一个由小到大排列的递增序列,所以我们可以对树进行中序遍历,然后判断这个序列是否是严格递增的,如果是那么就是二叉搜索树,如果不是那么就不是二叉搜索树。

递归1解法就是采用这个思路的,将中序遍历序列放入列表 list 中,然后判断 list 是否递增。而递归2解法可以不使用列表,而是直接在递归的时候判断当前节点是否大于上一个遍历过的节点,如果递归结束所有节点都满足那么就是二叉搜索树,只要有一个节点是小于等于上一个节点的,那么就不是二叉搜索树。另外,要注意 pre 的初始值要比 int 的最小值小,因为题目的节点值数据范围是整个 int 范围,所以我们直接将 pre 设置为 long 类型数据,并初始化为 long 的最小值。

作者:花无缺(huawuque404.com)


🌸欢迎关注我的博客:花无缺-每一个不曾起舞的日子都是对生命的辜负~
🍻一起进步-刷题专栏:【力扣题解】
🥇往期精彩好文:
📢【全网最全爱心代码仓库】
📢【CSS选择器全解指南】
📢【HTML万字详解】
你们的点赞👍 收藏⭐ 留言📝 关注✅
是我持续创作,输出优质内容的最大动力!
谢谢!

这篇关于【力扣题解】P98-验证二叉搜索树-Java题解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/559377

相关文章

Java实现字节字符转bcd编码

《Java实现字节字符转bcd编码》BCD是一种将十进制数字编码为二进制的表示方式,常用于数字显示和存储,本文将介绍如何在Java中实现字节字符转BCD码的过程,需要的小伙伴可以了解下... 目录前言BCD码是什么Java实现字节转bcd编码方法补充总结前言BCD码(Binary-Coded Decima

SpringBoot全局域名替换的实现

《SpringBoot全局域名替换的实现》本文主要介绍了SpringBoot全局域名替换的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录 项目结构⚙️ 配置文件application.yml️ 配置类AppProperties.Ja

Java使用Javassist动态生成HelloWorld类

《Java使用Javassist动态生成HelloWorld类》Javassist是一个非常强大的字节码操作和定义库,它允许开发者在运行时创建新的类或者修改现有的类,本文将简单介绍如何使用Javass... 目录1. Javassist简介2. 环境准备3. 动态生成HelloWorld类3.1 创建CtC

JavaScript中的高级调试方法全攻略指南

《JavaScript中的高级调试方法全攻略指南》什么是高级JavaScript调试技巧,它比console.log有何优势,如何使用断点调试定位问题,通过本文,我们将深入解答这些问题,带您从理论到实... 目录观点与案例结合观点1观点2观点3观点4观点5高级调试技巧详解实战案例断点调试:定位变量错误性能分

Java实现将HTML文件与字符串转换为图片

《Java实现将HTML文件与字符串转换为图片》在Java开发中,我们经常会遇到将HTML内容转换为图片的需求,本文小编就来和大家详细讲讲如何使用FreeSpire.DocforJava库来实现这一功... 目录前言核心实现:html 转图片完整代码场景 1:转换本地 HTML 文件为图片场景 2:转换 H

Java使用jar命令配置服务器端口的完整指南

《Java使用jar命令配置服务器端口的完整指南》本文将详细介绍如何使用java-jar命令启动应用,并重点讲解如何配置服务器端口,同时提供一个实用的Web工具来简化这一过程,希望对大家有所帮助... 目录1. Java Jar文件简介1.1 什么是Jar文件1.2 创建可执行Jar文件2. 使用java

SpringBoot实现不同接口指定上传文件大小的具体步骤

《SpringBoot实现不同接口指定上传文件大小的具体步骤》:本文主要介绍在SpringBoot中通过自定义注解、AOP拦截和配置文件实现不同接口上传文件大小限制的方法,强调需设置全局阈值远大于... 目录一  springboot实现不同接口指定文件大小1.1 思路说明1.2 工程启动说明二 具体实施2

Java实现在Word文档中添加文本水印和图片水印的操作指南

《Java实现在Word文档中添加文本水印和图片水印的操作指南》在当今数字时代,文档的自动化处理与安全防护变得尤为重要,无论是为了保护版权、推广品牌,还是为了在文档中加入特定的标识,为Word文档添加... 目录引言Spire.Doc for Java:高效Word文档处理的利器代码实战:使用Java为Wo

SpringBoot日志级别与日志分组详解

《SpringBoot日志级别与日志分组详解》文章介绍了日志级别(ALL至OFF)及其作用,说明SpringBoot默认日志级别为INFO,可通过application.properties调整全局或... 目录日志级别1、级别内容2、调整日志级别调整默认日志级别调整指定类的日志级别项目开发过程中,利用日志

Java中的抽象类与abstract 关键字使用详解

《Java中的抽象类与abstract关键字使用详解》:本文主要介绍Java中的抽象类与abstract关键字使用详解,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、抽象类的概念二、使用 abstract2.1 修饰类 => 抽象类2.2 修饰方法 => 抽象方法,没有