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;特殊二叉树小结 二叉树的相关性质二叉…

css深度选择器>>>、/deep/ 、::v-deep 、:deep()

很多vue的组件库 , 如vant&#xff0c;elementUI&#xff0c; iview等都可能自定义样式。 如项目中用到了 elementui&#xff0c;如果使用预处理器 scss, sass,less , 修改样式可能修改不掉, 而且这种需求出现的频率非常高。但如果去掉scoped话又会影响全局样式。当然我们知道可…

设计模式之美学习笔记-理论篇1-面向对象的特性

一、设计模式前言 面向对象 主流的编程范式或者是编程风格有三种&#xff0c;它们分别是面向过程、面向对象和函数式编程。面向对象这种编程风格又是这其中最主流的。现在比较流行的编程语言大部分都是面向对象编程语言。大部分项目也都是基于面向对象编程风格开发的。面向对…

中职组网络安全-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 同…

哈希表Leetcode 1657. 确定两个字符串是否接近

如果可以使用以下操作从一个字符串得到另一个字符串&#xff0c;则认为两个字符串 接近 &#xff1a; 操作 1&#xff1a;交换任意两个 现有 字符。 例如&#xff0c;abcde -> aecdb操作 2&#xff1a;将一个 现有 字符的每次出现转换为另一个 现有 字符&#xff0c;并对另…

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…

项目申请书撰写【笔记】

撰写项目申请书需要良好的科技写作技能。好的项目申请书应该条理清 晰、逻辑严密。整份申请 书要有清晰的结构&#xff0c;每部分都有特定的功能&#xff0c;让项目评审人觉得一目了 然。每一段话也要有特定的功能&#xff0c;表达要有层次和递进。要注意起承转合、文脉通畅&am…

【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…

毕业项目分享

大家好&#xff0c;今天给大家分享112个有趣的Python实战项目&#xff0c;可以直接拿来实战练习&#xff0c;涵盖机器学习、爬虫、数据分析、数据可视化、大数据等内容&#xff0c;建议关注、收藏。 项目名称 主要技术 2023招聘数据分析可视化系统爬虫 7种薪资预测模型 Flas…

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

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

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

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

笔记二十二、使用路由state进行传递参数

22.1 父组件设置state路由参数 <NavLink toclassify state{{param_C: this.state.name, param_D: this.state.age}} className{this.activeStyle}>classify</NavLink> 父组件 Home/index.jsx import React from "react"; import {NavLink, Outlet} from…

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