leetcode--验证二叉搜索树

leetcode地址:验证二叉搜索树
给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。

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

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

示例 1:

在这里插入图片描述

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

在这里插入图片描述

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

提示:

树中节点数目范围在[1, 104] 内
-231 <= Node.val <= 231 - 1

实现思路
这个问题要求判断一棵二叉树是否是一个有效的二叉搜索树(BST)。二叉搜索树的定义如下:

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

为了验证一棵二叉树是否是BST,我们可以使用中序遍历的方法。对于BST,中序遍历应该产生一个严格递增的序列。

递归验证
设定当前节点的上下界,初始时根节点的上下界分别为负无穷大和正无穷大。
如果当前节点的值不在上下界之间,则该树不是BST。
递归检查左子树,更新上界为当前节点值;递归检查右子树,更新下界为当前节点值。
中序遍历
使用中序遍历,检查遍历过程中前一个节点的值是否小于当前节点的值。如果不满足,则该树不是BST。

代码详解

# 定义二叉树节点类
class TreeNode:def __init__(self, val=0, left=None, right=None):self.val = valself.left = leftself.right = right# 递归验证函数
def isValidBST(root: TreeNode) -> bool:def validate(node, low=float('-inf'), high=float('inf')):if not node:return Trueif not (low < node.val < high):return Falsereturn validate(node.left, low, node.val) and validate(node.right, node.val, high)return validate(root)# 中序遍历验证函数
def isValidBSTInorder(root: TreeNode) -> bool:stack, inorder = [], float('-inf')while stack or root:while root:stack.append(root)root = root.leftroot = stack.pop()if root.val <= inorder:return Falseinorder = root.valroot = root.rightreturn True# 测试示例
root = TreeNode(2)
root.left = TreeNode(1)
root.right = TreeNode(3)print(isValidBST(root))  # 输出: True
print(isValidBSTInorder(root))  # 输出: True

go实现

package mainimport ("fmt""math"
)// TreeNode is a binary tree node.
type TreeNode struct {Val   intLeft  *TreeNodeRight *TreeNode
}// validate function for recursive check
func validate(node *TreeNode, low, high int) bool {if node == nil {return true}if node.Val <= low || node.Val >= high {return false}return validate(node.Left, low, node.Val) && validate(node.Right, node.Val, high)
}// isValidBST checks if a binary tree is a valid BST
func isValidBST(root *TreeNode) bool {return validate(root, math.MinInt64, math.MaxInt64)
}// inOrderTraversal function for in-order traversal check
func inOrderTraversal(node *TreeNode, prev *int) bool {if node == nil {return true}if !inOrderTraversal(node.Left, prev) {return false}if node.Val <= *prev {return false}*prev = node.Valreturn inOrderTraversal(node.Right, prev)
}// isValidBSTInOrder checks if a binary tree is a valid BST using in-order traversal
func isValidBSTInOrder(root *TreeNode) bool {prev := math.MinInt64return inOrderTraversal(root, &prev)
}// Helper function to print the tree in-order
func printInOrder(node *TreeNode) {if node == nil {return}printInOrder(node.Left)fmt.Print(node.Val, " ")printInOrder(node.Right)
}func main() {root := &TreeNode{Val: 2}root.Left = &TreeNode{Val: 1}root.Right = &TreeNode{Val: 3}fmt.Println(isValidBST(root))       // Output: truefmt.Println(isValidBSTInOrder(root)) // Output: trueprintInOrder(root) // Output: 1 2 3 
}

kotlin实现

class TreeNode(var `val`: Int) {var left: TreeNode? = nullvar right: TreeNode? = null
}// 递归验证函数
fun isValidBST(root: TreeNode?): Boolean {fun validate(node: TreeNode?, low: Long, high: Long): Boolean {if (node == null) return trueif (node.`val` <= low || node.`val` >= high) return falsereturn validate(node.left, low, node.`val`.toLong()) && validate(node.right, node.`val`.toLong(), high)}return validate(root, Long.MIN_VALUE, Long.MAX_VALUE)
}// 中序遍历验证函数
fun isValidBSTInorder(root: TreeNode?): Boolean {var prev: Long = Long.MIN_VALUEfun inorder(node: TreeNode?): Boolean {if (node == null) return trueif (!inorder(node.left)) return falseif (node.`val`.toLong() <= prev) return falseprev = node.`val`.toLong()return inorder(node.right)}return inorder(root)
}// 测试示例
fun main() {val root = TreeNode(2)root.left = TreeNode(1)root.right = TreeNode(3)println(isValidBST(root))  // 输出: trueprintln(isValidBSTInorder(root))  // 输出: true
}

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

71.WEB渗透测试-信息收集- WAF、框架组件识别(11)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;70.WEB渗透测试-信息收集- WAF、框架组件识别&#xff08;10&#xff09;-CSDN博客 如果有…

人工智能和机器学习 (复旦大学计算机科学与技术实践工作站)20240703(上午场)人工智能初步、mind+人脸识别

前言 在这个科技日新月异的时代&#xff0c;人工智能&#xff08;AI&#xff09;已经逐渐渗透到我们生活的方方面面&#xff0c;从智能家居到自动驾驶&#xff0c;无一不彰显着AI的强大潜力。而人脸识别技术作为AI领域的一项重要应用&#xff0c;更是以其高效、便捷的特点受到了…

人工智能算法工程师(中级)课程2-Opencv视觉处理之高级操作

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下人工智能算法工程师(中级)课程2-Opencv视觉处理之高级操作。在上一节课中的OpenCV基础操作我们了解到OpenCV是一个开源的计算机视觉软件库。它提供了各种视觉处理函数&#xff0c;并支持多种编程语言&#xff0c;如…

USB眼图eye diagram测试

前言: USB有一种测量称为EYE图或信号完整性测试。考虑数字信号从发射机传输到接收机的过程。到达接收器的信号质量可能受到许多因素的影响,包括发射器、电缆或PCB迹线以及连接器。信号质量也被称为信号完整性。眼图是一种用于快速评估数字信号质量的图形工具。眼图这个名字之…

Gymnasium 借游戏来学习人工智能

既然有了免费的linux系统GPU&#xff0c;干脆演示一下使用drivecolab套件来训练模型。 !apt-get install -y build-essential swig !pip install box2d-py !pip install gymnasium[all] !pip install gymnasium[atari] gymnasium[accept-rom-license] !pip install stable_bas…

Python函数 之 模块和包

1.模块 1, 在Python 中, 每个以 .py 结尾的 Python 代码⽂件 都可以称为是⼀个模块。 2, 在模块中 别⼈书写好的功能(变量, 函数, 类)&#xff0c;我们可以拿来直接使⽤。 3, 我们自己写的代码文件&#xff0c; 想要作为模块让别⼈使⽤, 你的代码⽂件名(模块名) 满足标识符的规…

Linux驱动开发-03字符设备驱动框架搭建

一、字符设备驱动开发步骤 驱动模块的加载和卸载&#xff08;将驱动编译模块&#xff0c;insmod加载驱动运行&#xff09;字符设备注册与注销&#xff08;我们的驱动实际上是去操作底层的硬件&#xff0c;所以需要向系统注册一个设备&#xff0c;告诉Linux系统&#xff0c;我有…

JVM是如何创建一个对象的?

哈喽&#xff0c;大家好&#x1f389;&#xff0c;我是世杰。 本文我为大家介绍面试官经常考察的**「Java对象创建流程」** 照例在开头留一些面试考察内容~~ 面试连环call Java对象创建的流程是什么样?JVM执行new关键字时都有哪些操作?JVM在频繁创建对象时&#xff0c;如何…

Studying-代码随想录训练营day33| 动态规划理论基础、509.斐波那契函数、70.爬楼梯、746.使用最小花费爬楼梯

第33天&#xff0c;动态规划开始&#xff0c;新的算法&#x1f4aa;(ง •_•)ง&#xff0c;编程语言&#xff1a;C 目录 动态规划理论基础 动态规划的解题步骤 动态规划包含的问题 动态规划如何debug 509.斐波那契函数 70.爬楼梯 746.使用最小花费爬楼梯 总结 动态…

LeetCode热题100刷题10:46. 全排列、78. 子集、17. 电话号码的字母组合、39. 组合总和、138. 随机链表的复制

回溯问题 46. 全排列 全排列问题&#xff1a; path 递归终止条件&#xff1a;path中是否已存储所有元素&#xff1b; for循环处理节点集合&#xff1a;used0未被使用的元素 class Solution { public:vector<int> path;vector<vector<int>> res;void backt…

HTML 标签简写和全称及其对应的中文说明和实例

<!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>HTML 标签简写及全称</title><style>…

Linux udp编程

我最近开了几个专栏&#xff0c;诚信互三&#xff01; > |||《算法专栏》&#xff1a;&#xff1a;刷题教程来自网站《代码随想录》。||| > |||《C专栏》&#xff1a;&#xff1a;记录我学习C的经历&#xff0c;看完你一定会有收获。||| > |||《Linux专栏》&#xff1…

效果惊人!LivePortrait开源数字人技术,让静态照片生动起来

不得了了,快手已经不是众人所知的那个短视频娱乐平台了。 可灵AI视频的风口尚未过去,又推出了LivePortrait--开源的数字人项目。LivePortrait让你的照片动起来,合成逼真的动态人像视频,阿里通义EMO不再是唯一选择。 让图像动起来 LivePortrait 主要提供了对眼睛和嘴唇动作的…

20_Inception V3深度学习图像分类算法

回顾GoogleNet:传送门 1.1 介绍 InceptionV3是Google开发的一种深度卷积神经网络架构&#xff0c;它是Inception系列网络中的第三代模型&#xff0c;由Christian Szegedy等人在论文《Rethinking the Inception Architecture for Computer Vision》中提出&#xff0c;该论文发…

gitee上传和下载idea项目的流程

环境&#xff1a;idea2022 一、上传项目 1、在gitee中新建一个仓库。 2、打开所要上传的项目的文件夹&#xff0c;点击Git Bash&#xff0c;生成.git文件夹。 3、在idea中打开所要上传的项目&#xff0c;在控制台的Terminal菜单中&#xff0c;输入git add . (注意&#xf…

解决分布式环境下session共享问题

在分布式环境下&#xff0c;session会存在两个问题 第一个问题:不同域名下&#xff0c;浏览器存储的jsessionid是没有存储的。比如登录时认证服务auth.gulimall.com存储了session&#xff0c;但是搜索服务search.gulimall.com是没有这个session的&#xff1b; 第二个问题&…

鸟类领域超大规模检测实践,基于YOLOv8轻量级检测模型开发构建超大规模生活场景下500种鸟类检测识别分析系统

关于鸟类的检测、识别相关的开发实践在前面的系列博文中也有不少的实践记录&#xff0c;感兴趣的话可以自行移步阅读即可&#xff1a; 【检测类】 《AI识鸟&#xff0c;基于YOLOv5【n/s/m/l/x】全系列参数模型开发构建工业野外场景下鸟类检测识别分析系统》 《基于轻量级YOL…

Eyes Wide Shut Exploring the Visual Shortcomings of Multimodal LLMs

Eyes Wide Shut? Exploring the Visual Shortcomings of Multimodal LLMs 近两年多模态大模型&#xff08;Multimodal LLM&#xff0c;MLLM&#xff09;取得了巨大的进展&#xff0c;能够基于图片与人类对话&#xff0c;展现出强大的识别甚至推理能力。然而&#xff0c;在某些…

游戏AI的创造思路-技术基础-蒙特卡洛树搜索(2)

接上一篇&#xff0c;让我们来看更多的例子 目录 7. 更多例子 7.1. 国际象棋实例 7.2. RTS类游戏实例 7.3. FPS类游戏实例 7. 更多例子 蒙特卡洛树搜索&#xff08;Monte Carlo Tree Search&#xff0c;MCTS&#xff09;在游戏AI中有着广泛的应用&#xff0c;尤其是在那些…

孟德尔随机化--代谢生活方式与消化道癌

写在前面 今天阅读的文献是多种暴露与某结局的孟德尔随机化&#xff0c;算是以量取胜了。 The effect of metabolism-related lifestyle and clinical risk factors on digestive system cancers in East Asian populations: a two-sample Mendelian randomization analysis …