二叉搜索树--验证二叉搜索树

验证二叉搜索树-力扣 98 题

解题思路:利用二叉树中序遍历的特性:遍历出来的结果是升序的即符合二叉搜索树

对于二叉树中序遍历不是太理解的,作者推荐的小白书:二叉树的初步认识_加瓦不加班的博客-CSDN博客

中序非递归实现

// 解法1. 中序遍历非递归实现 1ms
public boolean isValidBST(TreeNode root) {TreeNode p = root;LinkedList<TreeNode> stack = new LinkedList<>();long prev = Long.MIN_VALUE;//记录上一个值while (p != null || !stack.isEmpty()) {if (p != null) {stack.push(p);p = p.left;} else {TreeNode pop = stack.pop();//如果相邻两个节点相等,也不应当通过测试if (prev >= pop.val) {return false;}prev = pop.val;p = pop.right;}}return true;
}
  • 记录 prev 需要用 long,否则若测试用例中最小的节点为 Integer.MIN_VALUE 则测试会失败

  • 注意,如果相邻两个节点相等,也不应当通过测试,例如,下面的树也是不合法的

中序递归实现

方法一:

// 解法2. 中序遍历递归实现(全局变量记录 prev) 0ms
long prev = Long.MIN_VALUE;
public boolean isValidBST2(TreeNode node) {if (node == null) {return true;}boolean a = isValidBST2(node.left);//加上这个是为了 当发现不符合时就不再去遍历剩下的节点 如果不加if (!a) 条件,就还好继续判断剩下节点是否合法就有点多此一举if (!a) {return false;}if (prev >= node.val) {return false;}prev = node.val;return isValidBST2(node.right);
}

方法二:

// 解法3. 中序遍历递归实现(局部变量记录 prev) 0ms
public boolean isValidBST(TreeNode root) {if (root == null) {return true;}return doValid(new AtomicLong(Long.MIN_VALUE),root);
}public boolean doValid(AtomicLong prev, TreeNode node) {if (node == null) {return true;}//左子树是否合法boolean a = doValid(prev, node.left);//值的判断if (prev.get() >= node.val) {return false;}prev.set(node.val);//右子树是否合法boolean b = doValid(prev, node.right);//最终两边都合法才算合法return a && b;
}
  • 为何不能用 Long 或 long?因为它们都是局部变量且不可变,因此每次赋值时,并不会改变其它方法调用时的 prev

  • 要么把 prev 设置为 AtomicLong,要么把 prev 设置为全局变量,而不要采用方法参数这样的局部变量

  • 上述代码并不是最有效率的,分析过程见视频讲解

上下限递归

解题思路:

  /*
         能否只判断父亲比左孩子大,比右孩子小? 答:不行的,案例2中:4的右边有个3就不符合,
         也就是说 这个思路只考虑了父与子之间的大小关系,而没有考虑到祖先与子孙之间的大小关系
    案例1:               4
                       /   \
                      2     6
                     / \
                    1   3
    */
    /*案例2:
                 4 
               /   \
              2     6 
                   / \
                  3   7 
     */
    // 解法4. 上下限递归实现 0ms
//                -∞ 4 +∞
//               /   \
//           -∞ 2  4  6 +∞
//                   / \
//                4 3 6 7 +∞
//什么叫上下限递归实现?  比如上面的4,4是根节点,所以4的上限:+∞  下限:-∞
//2的上限:4   下限:-∞    
//6的上限:+∞  下限:4   
//3的上限:6  下限:4 
//7的上限:+∞  下限:6

  /*能否只判断父亲比左孩子大,比右孩子小? 答:不行的,案例2中:4的右边有个3就不符合,也就是说 这个思路只考虑了父与子之间的大小关系,而没有考虑到祖先与子孙之间的大小关系案例1:               4/   \2     6/ \1   3*//*案例2:4 /   \2     6 / \3   7 */// 解法4. 上下限递归实现 0ms
//			    -∞ 4 +∞
//               /   \
//           -∞ 2  4  6 +∞
//                   / \
//                4 3 6 7 +∞
//什么叫上下限递归实现?  比如上面的4,4是根节点,所以4的上限:+∞  下限:-∞
//2的上限:4   下限:-∞    
//6的上限:+∞  下限:4   
//3的上限:6  下限:4 
//7的上限:+∞  下限:6
public boolean isValidBST(TreeNode node) {return doValid(node, Long.MIN_VALUE, Long.MAX_VALUE);
}private boolean doValid(TreeNode node, long min, long max) {if (node == null) {return true;}if (node.val <= min || node.val >= max) {return false;}return doValid(node.left, min, node.val) && doValid(node.right, node.val, max);
}
  • 设每个节点必须在一个范围内:(min, max),不包含边界,若节点值超过这个范围,则返回 false

  • 对于 node.left 范围肯定是 (min, node.val)

  • 对于 node.right 范围肯定是 (node.val, max)

  • 一开始不知道 min,max 则取 java 中长整数的最小、最大值

  • 本质是前序遍历 + 剪枝

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

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

相关文章

剖析伦敦银最新价格走势图

国际金融市场瞬息万变&#xff0c;伦敦银的价格走势会受到诸多因素的影响&#xff0c;比如重要经济数据的公布&#xff0c;国际间的政治博弈&#xff0c;突发的政经大事&#xff0c;都可以令白银价格的走势&#xff0c;在短时间内暴涨暴跌的情况。 要在伦敦银市场实现良好的收益…

CCF CSP认证 历年题目自练Day27

题目一 试题编号&#xff1a; 202104-1 试题名称&#xff1a; 灰度直方图 时间限制&#xff1a; 1.0s 内存限制&#xff1a; 512.0MB 样例输入 7 11 8 0 7 0 0 0 7 0 0 7 7 0 7 0 7 0 7 0 7 0 7 0 7 7 0 0 0 7 0 0 0 7 0 7 7 0 0 0 0 7 0 0 7 7 0 7 0 0 0 0 0 7 0 7 0 0 7 0 …

Apache Doris (三十九):Doris数据导出 - MySQL dump导出

🏡 个人主页:IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 🚩 私聊博主:加入大数据技术讨论群聊,获取更多大数据资料。 🔔 博主个人B栈地址:豹哥教你大数据的个人空间-豹哥教你大数据个人主页-哔哩哔哩视频 目录

解决Opencv dnn模块无法使用onnx模型的问题(将onnx的动态输入改成静态)

一、问题来源 最近做人脸识别项目&#xff0c;想只用OpenCV自带的人脸检测和识别模块实现&#xff0c;使用OpenCV传统方法&#xff1a;Haar级联分类器人脸检测LBPH算法人脸识别的教程已经有了&#xff0c;于是想着用OpenCV中的dnn模块来实现&#xff0c;dnn实现人脸检测也有&a…

在 centos7 上安装Docker

1、检查linux内核 Docker 运行在 CentOS 7 上&#xff0c;要求系统为64位、系统内核版本为 3.10 以上。 Docker 运行在 CentOS-6.5 或更高的版本的 CentOS 上&#xff0c;要求系统为64位、系统内核版本为 2.6.32-431 或者更高版本。 uname -r 2、使用 root 权限登录 Centos…

vue-5

一、文章内容概括 1.自定义指令 基本语法&#xff08;全局、局部注册&#xff09;指令的值v-loading的指令封装 2.插槽 默认插槽具名插槽作用域插槽 3.综合案例&#xff1a;商品列表 MyTag组件封装MyTable组件封装 4.路由入门 单页应用程序路由VueRouter的基本使用 二…

JavaScript Web APIs第六天笔记

Web APIs - 第6天笔记 目标&#xff1a;能够利用正则表达式完成小兔鲜注册页面的表单验证&#xff0c;具备常见的表单验证能力 正则表达式综合案例阶段案例 正则表达式 正则表达式&#xff08;Regular Expression&#xff09;是一种字符串匹配的模式&#xff08;规则&#xf…

33 WEB漏洞-逻辑越权之水平垂直越权全解

目录 前言水平&#xff0c;垂直越权&#xff0c;未授权访问Pikachu-本地水平垂直越权演示(漏洞成因)墨者水平-身份认证失效漏洞实战(漏洞成因)原理越权检测-Burpsuite插件Authz安装测试(插件使用)修复防御方案 前言 越权漏洞文章分享&#xff1a;https://www.cnblogs.com/zhen…

零基础Linux_14(基础IO_文件)缓冲区+文件系统inode等

目录 1. 缓冲区 1.1 缓冲区的存在 1.2 缓冲区的刷新策略 1.3 模拟C标准库中的文件操作 完整代码及验证&#xff1a; 1.4 重看缓冲区 1.5 stdout和stderr的区别 2. 文件系统 2.1 磁盘的物理结构CHS等 2.2 磁盘的抽象结构LBA等 2.3 文件管理inode等 2.4 对文件的操作…

QT5 WebCapture 页面定时截图工具

QT5 WebCapture 网页定时截图工具 1.设置启动时间&#xff0c;程序会到启动时间后开始对网页依次进行截图 2.根据所需截图的页面加载速度&#xff0c;设置页面等待时间&#xff0c;尽量达到等页面加载完成后&#xff0c;再执行截图 3.根据需求&#xff0c;设置截图周期 4.程序…

理解http中cookie!C/C++实现网络的HTTP cookie

HTTP嗅探&#xff08;HTTP Sniffing&#xff09;是一种网络监控技术&#xff0c;通过截获并分析网络上传输的HTTP数据包来获取敏感信息或进行攻击。其中&#xff0c;嗅探器&#xff08;Sniffer&#xff09;是一种用于嗅探HTTP流量的工具。 在HTTP嗅探中&#xff0c;cookie是一…

集成内部高端电源开关LTC3637HMSE、LTC3637MPMSE稳压器,TJA1443AT汽车CAN FD收发器。

一、LTC3637 76V、1A 降压型稳压器 &#xff08;简介&#xff09;LTC3637是一款高效率降压DC/DC稳压器&#xff0c;集成内部高端电源开关&#xff0c;功耗仅12μA DC&#xff0c;空载时可保持稳定的输出电压。LTC3637可提供高达1A的负载电流&#xff0c;并具有可编程峰值电流限…

php+html+js+ajax实现文件上传

phphtmljsajax实现文件上传 目录 一、表单单文件上传 1、上传页面 2、接受文件上传php 二、表单多文件上传 1、上传页面 2、接受文件上传php 三、表单异步xhr文件上传 1、上传页面 2、接受文件上传php 四、表单异步ajax文件上传 1、上传页面 2、接受文件上传ph…

PCL点云处理之点云重建为Mesh模型并保存到PLY文件 ---方法二 (二百一十一)

PCL点云处理之点云重建为Mesh模型并保存到PLY文件 ---方法二 (二百一十一) 一、算法介绍二、算法实现1.代码2.效果一、算法介绍 离散点云重建为mesh网格模型,并保存到PLY文件中,用于其他软件打开查看,代码非常简短,复制粘贴即可迅速上手使用,具体参数根据自己的点云数据…

【STM32单片机】防盗报警器设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用STM32F103C8T6单片机控制器&#xff0c;使用按键、动态数码管、蜂鸣器、指示灯、热释电人体红外传感器等。 主要功能&#xff1a; 系统运行后&#xff0c;默认处于布防状态&#xff0c;D1指示灯…

Web3 新手攻略:9 个不可或缺的 APP 助力你踏入加密领域

Web3世界充满了无限机遇&#xff0c;但要掌握它&#xff0c;您需要合适的工具&#xfffd;&#xfffd;&#xfffd;。今天&#xff0c;我将为您介绍9款Web3必备APP&#xff0c;涵盖钱包、DEX、和工具三大类别。而且&#xff0c;我要特别强烈推荐一个强大的钱包——Bitget Wall…

CAN 通信-底层

本文主要以rockchip的rk3568平台基础&#xff0c;介绍can 控制器、硬件电路和底层驱动。 rk3568 CAN 控制器 概览 CAN(控制器区域网络)总线是一种稳健的车载总线标准,它允许微控制器和设备在没有主机计算机的应用中相互通信。它是一个基于消息的协议,最初是为了在汽车中多路…

网工内推 | 实施工程师,有软考证书优先,上市公司,最高14薪

01 新点软件 招聘岗位&#xff1a;实施工程师 职责描述&#xff1a; 1、负责一线项目组对接&#xff0c;完成项目前期信息、需求收集&#xff1b; 2、负责需求验证、管控、上线专项跟进工作&#xff1b; 3、负责在推进过程中总结与沉淀&#xff0c;提升优化对接规范/效率&…

蓝桥杯每日一题2023.10.11

子串分值和 - 蓝桥云课 (lanqiao.cn) 题目描述 题目分析 以下为50分方法&#xff08;暴力枚举&#xff09; 第一层循环枚举其长度&#xff0c;第二层循环枚举其左端点&#xff0c;k代表右端点&#xff0c;&#xff08;将每一种子串一一枚举出来&#xff09;算出从左端点到右…

mysql面试题29:大表查询的优化方案

该文章专注于面试&#xff0c;面试只要回答关键点即可&#xff0c;不需要对框架有非常深入的回答&#xff0c;如果你想应付面试&#xff0c;是足够了&#xff0c;抓住关键点 面试官&#xff1a;说一下大表查询的优化方案 以下是几种常见的大表优化方案&#xff1a; 分区&…