每日一练:LeeCode-98、 验证二叉搜索树【二叉搜索树+DFS】

本文是力扣LeeCode-98、 验证二叉搜索树【二叉搜索树+DFS】】 学习与理解过程,本文仅做学习之用,对本题感兴趣的小伙伴可以出门左拐LeeCode。

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

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

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

示例 1:
在这里插入图片描述

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

示例 2:
在这里插入图片描述

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

提示:

  • 树中节点数目范围在[1, 10^4] 内
  • -2^31 <= Node.val <= 2^31 - 1

思路

验证⼆叉搜索树,就相当于变成了判断⼀个序列是不是递增的了

递归法

这道题最简单的思路
由于是二叉搜索树,直接使用中序遍历树,并使用数组记录所有遍历节点的值,最后判断是否单调递增即可。

class Solution {List<Integer> list = new ArrayList<>();void traversal(TreeNode root){if(root==null)return;traversal(root.left);list.add(root.val);traversal(root.right);}public boolean isValidBST(TreeNode root) {traversal(root);for(int i=1;i<list.size();i++){if(list.get(i)<=list.get(i-1))return false;}return true;}
}

我们把⼆叉树转变为数组来判断,是最直观的,但其实不⽤转变成数组,可以在递归遍历的过程中直接判断是否有序

需要明确的点:

  • 我们要⽐较的是 左⼦树所有节点⼩于中间节点,右⼦树所有节点⼤于中间节点

1、确定递归函数,返回值以及参数
由于常规的递归遍历节点时,没有保存上一个遍历的节点,所有比较大小的时候,总会使用到Integer.MAX_VALUE之类的值作为比较的初始值,如果root.val不是Integer类型的,就会有很多适配性问题。所以此处递归使用保存上一个遍历的节点的方式
中序遍历,验证遍历的元素是不是从⼩到⼤

		TreeNode pre = null;    // ⽤来记录前⼀个节点,用Integer最小值boolean isValidBST(TreeNode root)

2、确定终⽌条件
⼆叉搜索树也可以为空!

		if (root==null)return true;

3、确定单层递归的逻辑
中序遍历,验证遍历的元素是不是从⼩到⼤,想着遍历顺序就行,由于需要使用返回值,作判断,所以isValidBST需要返回值

		boolean left = isValidBST(root.left);// 中序遍历,验证遍历的元素是不是从⼩到⼤,想着遍历顺序就行if (pre!=null && pre.val>=root.val)return false;pre = root; // 记录前⼀个节点boolean right = isValidBST(root.right);return left&&right;

整体代码

class Solution {TreeNode pre = null;    // ⽤来记录前⼀个节点public boolean isValidBST(TreeNode root) {if (root==null)return true;boolean left = isValidBST(root.left);// 中序遍历,验证遍历的元素是不是从⼩到⼤,想着遍历顺序就行if (pre!=null && pre.val>=root.val)return false;pre = root; // 记录前⼀个节点boolean right = isValidBST(root.right);return left&&right;}
}

最重要的一句话:做二叉树的题目,首先需要确认的是遍历顺序
大佬们有更好的方法,请不吝赐教,谢谢

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 每日一题 Day 62 - 75

1686. 石子游戏 VI Alice 和 Bob 轮流玩一个游戏&#xff0c;Alice 先手。 一堆石子里总共有 n 个石子&#xff0c;轮到某个玩家时&#xff0c;他可以 移出 一个石子并得到这个石子的价值。Alice 和 Bob 对石子价值有 不一样的的评判标准 。双方都知道对方的评判标准。 给你…

基于MQTT协议的消息代理软件(Mosquitto)介绍与应用

文章目录 一、Mosquitto是什么二、Mosquitto的特点三、Mosquitto常用命令四、Mosquitto的主要应用场景五、Mosquitto的下载与安装六、Mosquitto如何使用 一、Mosquitto是什么 Mosquitto是一个开源的消息代理软件&#xff0c;它实现了MQTT&#xff08;Message Queuing Telemetry…

OTA升级时序

ECU启动时序 在上电/复位后&#xff0c; ECU 执行 Bootloader 程序。 Bootloader 程序首先执行一些基本的初始化&#xff0c;然后检查外部编程请求标志位是否置为 TURE。如果外部编程请求标志位置为 TURE&#xff0c;即使应用程序是有效的&#xff0c;Bootloader 程序 也会继续…

[OPEN SQL] 更新数据

UPDATE语句用于更新数据库表中的数据 本次操作使用的数据库表为SCUSTOM&#xff0c;其字段内容如下所示 航班用户(SCUSTOM) 需要操作更新以下数据 1.更新单条数据 语法格式 UPDATE <dbtab> FROM <wa>. UPDATE <dbtab> FROM TABLE <itab>. UPDATE &l…

电脑监控屏幕软件有哪些(监控电脑屏幕的软件)

随着信息技术的迅猛发展&#xff0c;电脑屏幕监控软件已成为企业、家庭以及教育机构保护数据安全、提升工作效率以及进行行为分析的重要工具。本文将详细介绍几款主流的电脑屏幕监控软件&#xff0c;包括它们的功能、特点以及适用场景&#xff0c;帮助读者更好地了解并选择合适…

【C++第二阶段-重载-关系运算符函数调用】

你好你好&#xff01; 以下内容仅为当前认识&#xff0c;可能有不足之处&#xff0c;欢迎讨论&#xff01; 文章目录 关系运算符-重载-判断相等函数调用运算符重载 关系运算符-重载-判断相等 场景&#xff1a;两个对象&#xff0c;若有年龄和性别的不同&#xff0c;是否可以直…

Stable Diffusion 的提示词入门

一、正向提示词和反向提示词 Stable Diffusion 中的提示词通常用于指导用户对生成的图像进行控制。这些提示词可以分为正向提示词&#xff08;Positive Prompts&#xff09;和反向提示词&#xff08;Negative Prompts&#xff09;两类&#xff0c;它们分别影响图像生成过程中的…

H12-821_48

48.下面是台路由器输出的BGP信息,关于这段信息描述措误的是 A.路由器的Router ID是1.1.1.9 B.display bgp network命令来显示BGP通过network ( BGP)的通告的路由信息 C.该路由器所在AS号是10 D.该路由器通过import-route命今引入了4.4.4.0/24的网段 答案&#xff1a;D 注释&am…

Panalog 日志审计系统 sessiptbl.php 前台RCE漏洞复现

0x01 产品简介 Panalog是一款日志审计系统,方便用户统一集中监控、管理在网的海量设备。 0x02 漏洞概述 Panalog日志审计系统 sessiptbl.php接口处存在远程命令执行漏洞,攻击者可执行任意命令,接管服务器权限。 0x03 影响范围 version <= MARS r10p1Free 0x04 复现…

c++阶梯之类与对象(下)

前文&#xff1a; c阶梯之类与对象&#xff08;上&#xff09;-CSDN博客 c阶梯之类与对象&#xff08;中&#xff09;-CSDN博客 c阶梯之类与对象&#xff08;中&#xff09;&#xff1c; 续集 &#xff1e;-CSDN博客 1. 再谈构造函数 1.1 构造函数体赋值 在创建对象时&a…

[经验] 欧阳修唐宋八大家之首是谁 #微信#知识分享#学习方法

欧阳修唐宋八大家之首是谁 1、唐宋八大家之首是谁 唐宋八大家是中国文学史上最具代表性的八位大文豪&#xff0c;他们的文学成就在中国文学史上占有重要地位&#xff0c;被誉为文学史上的“巨人”。 唐宋八大家之首&#xff0c;无疑是唐代著名诗人杜甫。他出生在一个贫苦的家…

嵌入式I2C 信号线为何加上拉电阻(图文并茂)

IIC 是一个两线串行通信总线&#xff0c;包含一个 SCL 信号和 SDA 信号&#xff0c;SCL 是时钟信号&#xff0c;从主设备发出&#xff0c;SDA 是数据信号&#xff0c;是一个双向的&#xff0c;设备发送数据和接收数据都是通过 SDA 信号。 在设计 IIC 信号电路的时候我们会在 SC…