【力扣题解】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

相关文章

SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志

《SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志》在SpringBoot项目中,使用logback-spring.xml配置屏蔽特定路径的日志有两种常用方式,文中的... 目录方案一:基础配置(直接关闭目标路径日志)方案二:结合 Spring Profile 按环境屏蔽关

Java使用HttpClient实现图片下载与本地保存功能

《Java使用HttpClient实现图片下载与本地保存功能》在当今数字化时代,网络资源的获取与处理已成为软件开发中的常见需求,其中,图片作为网络上最常见的资源之一,其下载与保存功能在许多应用场景中都... 目录引言一、Apache HttpClient简介二、技术栈与环境准备三、实现图片下载与保存功能1.

SpringBoot排查和解决JSON解析错误(400 Bad Request)的方法

《SpringBoot排查和解决JSON解析错误(400BadRequest)的方法》在开发SpringBootRESTfulAPI时,客户端与服务端的数据交互通常使用JSON格式,然而,JSON... 目录问题背景1. 问题描述2. 错误分析解决方案1. 手动重新输入jsON2. 使用工具清理JSON3.

java中long的一些常见用法

《java中long的一些常见用法》在Java中,long是一种基本数据类型,用于表示长整型数值,接下来通过本文给大家介绍java中long的一些常见用法,感兴趣的朋友一起看看吧... 在Java中,long是一种基本数据类型,用于表示长整型数值。它的取值范围比int更大,从-922337203685477

java Long 与long之间的转换流程

《javaLong与long之间的转换流程》Long类提供了一些方法,用于在long和其他数据类型(如String)之间进行转换,本文将详细介绍如何在Java中实现Long和long之间的转换,感... 目录概述流程步骤1:将long转换为Long对象步骤2:将Longhttp://www.cppcns.c

SpringBoot集成LiteFlow实现轻量级工作流引擎的详细过程

《SpringBoot集成LiteFlow实现轻量级工作流引擎的详细过程》LiteFlow是一款专注于逻辑驱动流程编排的轻量级框架,它以组件化方式快速构建和执行业务流程,有效解耦复杂业务逻辑,下面给大... 目录一、基础概念1.1 组件(Component)1.2 规则(Rule)1.3 上下文(Conte

SpringBoot服务获取Pod当前IP的两种方案

《SpringBoot服务获取Pod当前IP的两种方案》在Kubernetes集群中,SpringBoot服务获取Pod当前IP的方案主要有两种,通过环境变量注入或通过Java代码动态获取网络接口IP... 目录方案一:通过 Kubernetes Downward API 注入环境变量原理步骤方案二:通过

Springboot整合Redis主从实践

《Springboot整合Redis主从实践》:本文主要介绍Springboot整合Redis主从的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言原配置现配置测试LettuceConnectionFactory.setShareNativeConnect

Java中Map.Entry()含义及方法使用代码

《Java中Map.Entry()含义及方法使用代码》:本文主要介绍Java中Map.Entry()含义及方法使用的相关资料,Map.Entry是Java中Map的静态内部接口,用于表示键值对,其... 目录前言 Map.Entry作用核心方法常见使用场景1. 遍历 Map 的所有键值对2. 直接修改 Ma

Java中实现线程的创建和启动的方法

《Java中实现线程的创建和启动的方法》在Java中,实现线程的创建和启动是两个不同但紧密相关的概念,理解为什么要启动线程(调用start()方法)而非直接调用run()方法,是掌握多线程编程的关键,... 目录1. 线程的生命周期2. start() vs run() 的本质区别3. 为什么必须通过 st