当前位置:网站首页>leetcode刷题第13天二叉树系列之《98 BST及其验证》
leetcode刷题第13天二叉树系列之《98 BST及其验证》
2022-08-11 03:42:00 【小机double】
98 BST及其验证
BST即二叉binary search tree,二叉搜索树,也有称为是二叉排序树的,当对其使用中序遍历的时候可以得到一个递增的序列。
题目描述
给定一个二叉树,判断其是否是一个有效的二叉搜索树
假设一个二叉搜索树具有如下特征:
节点的左子树只包含小于当前节点的数。
节点的右子树只包含大于当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。
示例
输入:
2
/
1 3输出:true
输入:
5
/ \
1 4
/ \
3 6
输出:false
解释:根节点的值为5,但是其右子节点的值为4,不满足右子树所有节点的值大于根节点的条件
题目解析
根据题目提示的深度优先搜索,可以使用递归的方式来写。每次判断左右子树是否满足二叉搜索树的条件即可;
左子树的所有节点的值小于根节点的值
右子树所有节点的值大于根节点的值
但是这里并不仅仅只是比较根节点和左右节点的值满足条件即可,它是要在整棵二叉树上都满足条件的,因此对于每个节点的取值应该有一个边界范围,例如:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hCymzVOj-1601715451019)(D:\我的博客\刷题\img\leetCode98图示1.png)]
因此在递归的时候返回false时就不能只是比较左右节点和父亲节点的大小了,具体怎么做也是看了大佬的代码之后才理解的,代码如下:
public boolean isBST(TreeNode root, long min, long max) {
if (root == null) {
return true;
}
if (root.val <= min || root.val >= max) {
return false;
}
return isBST(root.left, min, root.val) && isBST(root.right, root.val, max);
}
public boolean isValidBST(TreeNode root) {
if (root == null) {
return true;
}
return isBST(root, Long.MIN_VALUE, Long.MAX_VALUE);
}
实现思路如下:
先使用一个极大值和极小值充当边界的判断条件,确保整颗树的根节点值在这个范围内,这里使用Long类型的最大值是因为自己在代码提交的时候有个测试用例是int类型的最大值,导致错误。
程序第一进入isBST函数时,对于
root.val <= min || root.val >= max该条件的bool值为真。则进入到下面的递归条件中。
而这个递归也被设置的很简洁,对于左子树的节点,其边界的最小值没有改变,而最大值设置为当前节点的值,即左子树的节点不能比当前节点的值大;对于右子树的节点,其边界的最大值没有改变,而最小值设置为当前节点的值,即右子树的节点不能比当前节点的值小。
判断条件判断每个节点的范围是否在(min, max),超出该范围则返回false,而边界条件的约束又由递归时候参数传递给出。
程序执行结果:

参考:小浩算法-BST及其验证
边栏推荐
- oracle的基数会影响到查询速度吗?
- CTO said that the number of rows in a MySQL table should not exceed 2000w, why?
- Traversal of DOM tree-----modify styles, select elements, create and delete nodes
- 浮点数在内存中的存储方式
- C language recv() function, recvfrom() function, recvmsg() function
- Watch to monitor
- MYSQLg advanced ------ return table
- Day20 FPGA 】 【 - block the I2C read and write EEPROM
- MongoDB 基础了解(二)
- 我的 archinstall 使用手册
猜你喜欢

MongoDB 基础了解(二)

Interchangeability Measurements and Techniques - Calculation of Deviations and Tolerances, Drawing of Tolerance Charts, Selection of Fits and Tolerance Classes

Build Zabbix Kubernetes cluster monitoring platform

多商户商城系统功能拆解26讲-平台端分销设置

电力机柜数据监测RTU

Power Cabinet Data Monitoring RTU

Multi-serial port RS485 industrial gateway BL110

Detailed explanation of VIT source code

QueryDet:级联稀疏query加速高分辨率下的小目标检测

EasyCVR接入GB28181设备时,设备接入正常但视频无法播放是什么原因?
随机推荐
Is there any way for kingbaseES to not read the system view under sys_catalog by default?
C语言 recv()函数、recvfrom()函数、recvmsg()函数
Talk about the understanding of RPC
输入起始位置,终止位置截取链表
UNI-APP_iphone bottom safe area
font
构建程序化交易系统需要注意什么问题?
树莓派入门(5)系统备份
The solution to the height collapse problem
作业8.10 TFTP协议 下载功能
音视频开发,为什么要学习FFmpeg?应该怎么入手FFmpeg学习?
二叉树相关代码题【较全】C语言
【ADI低功耗2k代码】基于ADuCM4050的ADXL363、TMP75的加速度、温度检测及串口打印、蜂鸣器播放音乐(孤勇者)
用户如何克服程序化交易中的情绪问题?
80端口和443端口是什么?有什么区别?
Day20 FPGA 】 【 - block the I2C read and write EEPROM
互换性与测量技术-公差原则与选用方法
Is Redis old?Performance comparison between Redis and Dragonfly
js 将字符串作为js执行代码使用
The "top pillar" slides, and new growth is extremely difficult to shoulder the heavy responsibility. Is Ali "squatting" to jump higher?