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://www.mzph.cn/bicheng/43891.shtml

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

相关文章

StarRocks分布式元数据源码解析

1. 支持元数据表 https://github.com/StarRocks/starrocks/pull/44276/files 核心类&#xff1a;LogicalIcebergMetadataTable&#xff0c;Iceberg元数据表&#xff0c;将元数据的各个字段做成表的列&#xff0c;后期可以通过sql操作从元数据获取字段&#xff0c;这个表的组成…

数据结构——顺序表【C】

顺序表 1. 顺序表的概念以及结构1.1概念1.2静态顺序表和动态顺序表 2. 顺序表接口模拟实现接口总览2.1 初始化数据和销毁容器 2.2 顺序表的尾插和尾删2.3 头插和头删2.4 任意位置插入和删除数据2.5 查找数据 3. 顺序表的问题 &#xff1a; 1. 顺序表的概念以及结构 1.1概念 顺…

贴脸细看Mixtral 8x7B- 稀疏混合专家模型(MoE)的创新与推动

贴脸细看Mixtral 8x7B- 稀疏混合专家模型&#xff08;MoE&#xff09;的创新与推动 原创 一路到底孟子敬 上堵吟 2024年01月15日 20:05 美国 I. 引言 A. Mixtral 8x7B的背景和目的 • 背景&#xff1a;随着大型语言模型在自然语言处理&#xff08;NLP&#xff09;领域的广泛…

社交论坛圈子系统APP开发社交圈子小程序系统源码开源,带语音派对聊天室/圈子社交论坛及时聊天

功能// 首页左右滑动切换分类 使用资讯类app常见的滑动切换分类&#xff0c;让用户使用更方便。 2信息卡片流展示 每条信息都是一个卡片&#xff0c;头像展示会员标签&#xff0c;单图自动宽度&#xff0c;多图九宫格展示&#xff0c;底部展示信息发布地址&#xff0c;阅读量、…

Camera Raw:常规工具

在 Camera Raw 窗口右下角提供了四个常用的工具&#xff0c;它们分别是&#xff1a;缩放工具、抓手工具、切换取样器叠加以及切换网格叠加工具。 ◆ ◆ ◆ 缩放工具 Zoom Tool 用于放大或缩小预览图像&#xff0c;便于查看和编辑细节。 快捷键&#xff1a;Z 1、双击“缩放工具…

10-windows自带的磁盘上传配额限制?提示这个错误:XXX用户上空间不足,需要XXMB来复制此项目,请删除或移动文件来获得足够的空间如何解决?

1.配置缘由&#xff1a; Windows自带的功能&#xff1a;限制某个磁盘登录的用户上传到这块磁盘的文件容量大小。 2.配置磁盘配额步骤: 右键整块磁盘--属性--配额 3.提示这个错误&#xff1a;XXX用户上空间不足&#xff0c;需要XXMB来复制此项目&#xff0c;请删除或移动文件来…

普中51单片机:中断系统与寄存器解析(六)

文章目录 引言中断流程图中断优先级下降沿中断结构图中断相关寄存器IE中断允许寄存器&#xff08;可位寻址&#xff09;XICON辅助中断控制寄存器&#xff08;可位寻址&#xff09;TCON标志控制寄存器SCON串行口控制寄存器 中断号中断响应条件中断函数代码模板电路图开发板IO连接…

局域网远程共享桌面如何实现

在局域网内实现远程共享桌面&#xff0c;可以通过以下几种方法&#xff1a; 一、使用Windows自带的远程桌面功能&#xff1a; 首先&#xff0c;在需要被控制的电脑上右键点击“此电脑”&#xff0c;选择“属性”。 进入计算机属性界面后&#xff0c;点击“高级系统设置”&am…

qt writeDatagram 函数详解

writeDatagram 是 Qt 网络编程中的一个函数&#xff0c;它属于 QUdpSocket 类。这个函数的主要作用是向指定的网络地址和端口发送一个数据报&#xff08;datagram&#xff09;。数据报是网络传输中的基本单位&#xff0c;通常用于无连接的网络服务&#xff0c;如 UDP。 函数原…

SpringAMQP收发消息demo

首先我们需要创建一个微服务的架构&#xff0c;因为一般来讲这个都是在微服务架构下去使用的&#xff08;当然单体也没什么不好&#xff0c;看qps&#xff09; 在父项目中我们需要引入amqp的依赖 <dependencies><dependency><groupId>org.springframework.…

Jupyter Notebook详尽安装教程

Jupyter Notebook是一款开放源代码的Web应用程序&#xff0c;它允许用户创建和共享包含实时代码、方程式、可视化和叙述文本的文档。它适用于数据分析、可视化、机器学习等多种场景&#xff0c;尤其在数据科学领域中广受欢迎。本文将指导你从零开始&#xff0c;一步步安装和配置…

DNS--

1.DNS作用 -互联网中的114查号台/导航员 全球13台DNS根服务器分布&#xff1a; 美国VeriSign公司 2台 网络管理组织IANA(Internet Assigned Number Authority) 1台 欧洲网络管理组织RIPE-NCC(Resource IP Europeens Network Coordination Centre) 1台 美国PSINet公司 1台…

在Ubuntu 16.04上安装和配置VNC的方法

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 ###介绍 VNC&#xff0c;即“Virtual Network Computing”&#xff0c;是一种连接系统&#xff0c;允许您使用键盘和鼠标与远程服务器上…

写一个字符设备的驱动步骤

一、前期准备 了解设备和需求&#xff1a; 深入研究字符设备的硬件手册和数据表&#xff0c;理解其工作原理、接口、寄存器、中断等。确定设备驱动需要支持的功能和操作。 准备开发环境&#xff1a; 确保有运行Linux系统的开发板&#xff0c;且其zImage是自己编译的&#x…

suricata7 rule加载(三)加载options

suricata7.0.5 加载options (msg:“HTTP Request Example”; flow:established,to_server; http.method; content:“POST”; http.uri; content:“query.php”; bsize:>9; http.protocol; content:“HTTP/1.1”; bsize:8; http.host; content:“360”; bsize:>3; class…

代理详解之静态代理、动态代理、SpringAOP实现

1、代理介绍 代理是指一个对象A通过持有另一个对象B&#xff0c;可以具有B同样的行为的模式。为了对外开放协议&#xff0c;B往往实现了一个接口&#xff0c;A也会去实现接口。但是B是“真正”实现类&#xff0c;A则比较“虚”&#xff0c;他借用了B的方法去实现接口的方法。A…

音视频封装demo:将h264数据和aac数据封装(mux)成FLV文件(纯手工,不依赖第三方开源库)

1、README 前言 注意&#xff1a;flv是不支持h.265封装的。 a. demo使用 $ make clean && make DEBUG1 $ $ ./flv_mux_h264_aac Usage:./flv_mux_h264_aac avfile/test1_856x480_24fps.h264 24 avfile/test1_44100_stereo.aac out1.flv./flv_mux_h264_aac avfile/tes…

vue3 + element-plus 表格行内编辑,如何实现表单校验?

问题描述&#xff1a; 当使用table实现行内编辑时&#xff0c;往往需要对必填项增加校验以及错误高度&#xff0c; 预期实现效果如下&#xff1a; 实现思路&#xff1a; 使用el-form表单自身的校验功能&#xff1a;通过el-from绑定对应表格行的prop&#xff0c; 实现校验 页面…

@SpringBootApplication 注解

什么是 SpringBootApplication SpringBootApplication 是 Spring Boot 提供的一个核心注解&#xff0c;它是一个组合注解&#xff0c;用于简化 Spring Boot 应用程序的配置。这个注解通常标注在主类上&#xff0c;用于标识一个 Spring Boot 应用的入口。通过这个注解&#xff…

【力扣】每日一题—第70题,爬楼梯

题目&#xff1a; 假设你正在爬楼梯。需要n阶你才能到达楼顶。 每次你可以爬1或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 思路&#xff1a; 我开始是写了一个函数计算爬一层和爬二层的个数&#xff0c;之后排列求和&#xff0c;但是超范围了&#xff0c…