Leetcode98 验证二叉搜索树

题意理解:

        首先明确二叉树的定义,对于所有节点,根节点的值大于左子树所有节点的值,小于右子树所有节点的值。

注意一个误区: 

       根节点简单和左孩子,右孩子比大小是不够的,要和子树比,如下图:

       他每个节点根节点大于左孩子,小于右孩子。

       但是他的每个根节点不大于左子树的所有节点的值,小于右子树所有节点的值,它是无序的,不是一颗二叉搜索树.

二叉搜索树的特点:

        二叉搜索树的中序遍历是单调递增的数列。

1.数列递增判断【其实也是递归】

已知二叉搜索树的中序遍历的单调递增的,所以只要判断二叉树中序遍历数列是否单调递增即可。

//一个合法的搜索二叉树的中序遍历应该是严格的递增数列List<Integer> reuslt=new ArrayList<>();public boolean isValidBST(TreeNode root) {if(root==null) return true;//中序遍历是递增序列//左节点处理boolean left=isValidBST(root.left);//根节点处理//数列为空的时候,直接往进加//数列不为空的时候与数列最后一位的值比大小,//  比它大则说明单调递增//  比它小则说明不符合单调递增,返回falseif(reuslt.size()==0||reuslt.get(reuslt.size()-1)< root.val){reuslt.add(root.val);}else{return false;}//右节点处理boolean right=isValidBST(root.right);return left&right;}

2.递归

//递归//为什么用long?//因为节点值-2^31 <= Node.val <= 2^31 - 1,囊括了int范围所有值//maxValue初始为比int最小值还小的值//故取long的最小值,long的取值范围比int更广Long maxValue=Long.MIN_VALUE;public boolean isValidBST2(TreeNode root) {if(root==null) return true;//中序遍历//左子树验证boolean left=isValidBST2(root.left);//中节点处理//  maxValue总是保存当前递增的最大值//  当前值比maxValue大,则说明符合单调递增,将当前值给maxValue//  当前值比maxValue小,则说明不符合单调递增,返回falseif(maxValue<root.val) maxValue=(long)root.val;else return false;//右子树验证boolean right=isValidBST2(root.right);return left&right;}

3.递归+双指针优化

把maxValue改为使用 TreeNode pre,来指向遍历的前一个节点,root总是指向当前节点,不需要复杂的考虑long还是int的问题,其余地方其实是一样的。

//递归+双指针TreeNode pre=null;public boolean isValidBST3(TreeNode root) {if(root==null) return true;boolean left=isValidBST3(root.left);if(pre==null||pre.val< root.val) pre=root;else return false;boolean right=isValidBST3(root.right);return left&right;}

4.迭代

迭代还是之前遍历的套路,需要使用栈保存节点,模拟递归,会有一点麻烦。

public boolean isValidBST4(TreeNode root) {if(root==null) return true;//模拟递归的栈Stack<TreeNode> stack=new Stack<>();stack.push(root);TreeNode pre=null;while(!stack.isEmpty()){TreeNode tmpRoot=stack.peek();//当前节点是否为空?if(tmpRoot!=null){//若节点不为空,则弹出当前节点//由于栈总是先进后出,故左中右节点的入栈顺序应为:右中左//为了识别中节点,在中间节点入栈后,加入一个null值,所有null值后总是中间节点,用于判断。//左右节点不为空时,入栈,所以左右节点不会引入null值stack.pop();if(tmpRoot.right!=null)stack.push(tmpRoot.right);stack.push(tmpRoot);stack.push(null);if(tmpRoot.left!=null)stack.push(tmpRoot.left);}else{//若当前节点为空,则只有可能我们是在之前的操作中引入的null值//将当前null值弹出后,取下一位进行比较//若遍历前一位节点为空或当前节点大于pre节点值,则将当前节点给pre//否则:当前节点小于pre的值,不符合单调增,返回falsestack.pop();TreeNode tmp=stack.pop();if(pre==null||tmp.val>pre.val) pre=tmp;else return false;}}return true;}

5.分析

时间复杂度:

        数列递增:O(n)

        递归:O(n)

        递归+双指针:O(n)

        迭代: O(n)

空间复杂度:

        数列递增:O(n)

        递归:O(1)

        递归+双指针:O(1)

        迭代:O(n)

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

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

相关文章

2024年天津天狮学院专升本专业课考试报名通知

天津天狮学院2024年高职升本科专业课报名时间考试时间通知 1.报名条件 报名条件和具体要求按照天津市招生委员会的文件规定执行。考生必须完成文化课报名环节&#xff0c;且填报天津天狮学院志愿&#xff0c;方可报考我校专业课考试。考生提供的各种证件应真实有效&#xff0…

数据结构和算法-树和二叉树的定义和基本术语和性质

文章目录 树的基本概念和相关术语相关的应用节点间的关系描述节点&#xff0c;树的属性描述有序树vs无序树树vs森林小结 树的相关性质考点1考点2考点3考点4考点5考点6小结 二叉树的相关概念和基本术语重要 &#xff08;五种状态&#xff09;特殊二叉树小结 二叉树的相关性质二叉…

中职组网络安全-FTPServer20221010.img(环境+解析)

任务环境说明&#xff1a; √服务器场景&#xff1a;FTPServer20221010.img √服务器操作系统&#xff1a;未知&#xff08;关闭链接&#xff09; √FTP用户名&#xff1a;attack817 密码&#xff1a;attack817 1.分析attack.pcapng数据包文件&#xff0c;通过分析数据包attack…

elasticsearch聚合、自动补全、数据同步

目录 一、数据聚合1.1 聚合的种类1.2 DSL实现聚合1.2.1 Bucket聚合语法1.2.2 聚合结果排序1.2.3 限定聚合范围1.2.4 Metric聚合语法 1.3 RestAPI实现聚合 二、自动补全2.1 拼音分词器2.2 自定义分词器2.3 自动补全查询2.4 RestAPI实现自动补全 三、数据同步3.1 思路分析3.1.1 同…

PCP的Parallel Repetition

1. 引言 见Alessandro Chiesa等人2023年论文《On Parallel Repetition of PCPs》。 Parallel Repetition&#xff08;并行重复&#xff09;可用于&#xff1a; 降低probabilistic proofs的soundness error 的同时提升某些衡量指标的效率 interactive proofs&#xff08;IPs…

模型层——多表操作

多表操作 一 创建模型 实例&#xff1a;我们来假定下面这些概念&#xff0c;字段和关系 作者模型&#xff1a;一个作者有姓名和年龄。 作者详细模型&#xff1a;把作者的详情放到详情表&#xff0c;包含生日&#xff0c;手机号&#xff0c;家庭住址等信息。作者详情模型和作…

YOLOv5全网独家首发改进:SENetv2,Squeeze-Excitation模块融合Dense Layer,效果秒杀SENet

💡💡💡本文自研创新改进:SENet v2,针对SENet主要优化点,提出新颖的多分支Dense Layer,并与Squeeze-Excitation网络模块高效融合,融合增强了网络捕获通道模式和全局知识的能力 推荐指数:五星 收录 YOLOv5原创自研 https://blog.csdn.net/m0_63774211/catego…

【24押题卷】小马哥终极押题3+1!

告别11月&#xff0c;迎接12月&#xff01;说来也是缘分&#xff0c;各平台发了快200套真题&#xff0c;梳理了6本教材课后习题&#xff0c;讲解了吴大正、郑君里、奥本三本重点习题。终于我“悟了”&#xff0c;你们会发现&#xff0c;我今年做的每一套真题解析&#xff0c;几…

Linux Ubuntu protobuf 安装方法

文章目录 安装方法检验安装意外状况 安装方法 去GitHub官网找下载地址 安装 protobuf 21.11 GitHub 资源地址 选择安装版本 &#xff08;是一个URL网址&#xff09; 例如这里选用&#xff1a;protobuf-all-21.11.zip 资源 安装依赖库&#xff0c;执行指令 6. sudo apt-get …

【Node.js】笔记整理4 - 版本管理工具nvm

写在最前&#xff1a;跟着视频学习只是为了在新手期快速入门。想要学习全面、进阶的知识&#xff0c;需要格外注重实战和官方技术文档&#xff0c;文档建议作为手册使用 系列文章 【Node.js】笔记整理 1 - 基础知识【Node.js】笔记整理 2 - 常用模块【Node.js】笔记整理 3 - n…

【JAVA面向对象编程】--- 探索子类如何继承父类

&#x1f308;个人主页: Aileen_0v0&#x1f525;学习专栏: Java学习系列专栏 &#x1f4ab;个人格言:"没有罗马,那就自己创造罗马~" 目录 继承 继承的普通成员方法调用 及 普通成员变量修改 构造方法的调用 子类构造方法 继承 package Inherit;class Animal …

如何制作一个数字人?流程是怎样的?

​​虚拟人概念从早期动漫领域的初音未来用一首《甩葱歌》让绿色双马尾的“歌姬”形象火出圈&#xff0c;到洛天依登上央视春晚舞台&#xff0c;再到众多虚拟歌手、虚拟主播、KOL、代言人等活跃于各种情境中。 去年以来&#xff0c;元宇宙和虚拟人技术进入全球科技产业的聚光灯…

Day46力扣打卡

最近一直在做以前的题&#xff0c;刷题量都没有怎么增长&#xff0c;感觉自己算法一直不太行&#xff0c;但也只能菜就多练了。 打卡记录 由子序列构造的最长回文串的长度&#xff08;区间DP&#xff09; 链接 第二次刷这道题&#xff0c;相比上回思路来的很快&#xff0c;但…

IDEA maven无法下载源代码处理

1、使用idea内置maven 在idea中新增一个mvn运行项,截图如下: 输入命令: dependency:resolve -Dclassifiersources 2、如果外部maven&#xff0c;不使用idea内部maven 在工程目录下命令行执行命令: mvn dependency:resolve -Dclassifiersources

Linux信号超详细剖析

预备知识&#xff1a; 一、信号产生(OS发给进程) 1、键盘组合键 Linux中&#xff0c;一次登录对应一个终端&#xff0c;bash/shell。且只允许一个进程是前台进程&#xff0c;默认就是bash/shell&#xff0c;其它都是后台进程。获取键盘输入的是前台进程。 Ctrlc: 向前台进程…

面试题:什么是负载均衡?常见的负载均衡策略有哪些?

文章目录 一、负载均衡二、负载均衡模型分类三、CDN负载均衡四、LVS负载均衡4.1 LVS 支持的三种模式4.1.1 DR 模式4.1.2 TUN 模式4.1.3 NAT 模式 4.2 LVS 基于 Netfilter 的框架实现 五、负载均衡策略是什么六、常用负载均衡策略图解6.1 轮询6.2 加权轮询6.3 最少连接数6.4 最快…

C#基础与进阶扩展合集-进阶篇(持续更新)

目录 本文分两篇&#xff0c;基础篇点击&#xff1a;C#基础与进阶扩展合集-基础篇 二、进阶扩展 1、Predicate 2、设置C#语言版本 3、ListCollectionView过滤集合 4、Adapt适配器 5、值类型与引用类型 6、程序设置当前项目工作目录 7、获取App.config配置文件中的值 …

【计算机网络笔记】虚拟局域网(VLAN)

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…

使用 CSS Grid 的响应式网页设计:消除媒体查询过载

文章目录 前言介绍 CSS Grid让我们开始吧实现高级响应性1、Repeat() 2、Auto-fit3、Minmax()结论 前言 你是否厌倦了在实现响应式网站时需要管理多个媒体查询&#xff1f;说再见复杂的代码&#xff0c;拥抱更简单的解决方案吧&#xff1a;CSS Grid。 在这篇文章中&#xff0c;…

AC-DC 220V转12V 500毫安非隔离恒压恒流降压芯片

AC-DC 220V转12V 500毫安非隔离恒压恒流降压芯片是一款高性能的电源管理芯片&#xff0c;它能够将220V的交流电压降低到12V直流电压&#xff0c;并且具有恒压恒流输出、多模式控制、低待机功耗、高精度输出、内置软启动、多种保护功能等特点。 该芯片的非隔离系统恒压恒流输出可…