【二叉树】Leetcode 98. 验证二叉搜索树【中等】

验证二叉搜索树

给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。

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

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

示例1:
在这里插入图片描述
输入:root = [2,1,3]
输出:true

示例2:
在这里插入图片描述
输入:root = [5,1,4,null,null,3,6]
输出:false
解释:根节点的值是 5 ,但是右子节点的值是 4

解题思路1

判断一个二叉树是否是有效的二叉搜索树,可以通过中序遍历的方式来检查节点值是否按照升序排列。

  • 1、进行中序遍历二叉树,递归地遍历左子树、当前节点、右子树。
  • 2、在遍历过程中,记录上一个节点的值prev,初始值为负无穷。
  • 3、每次访问一个节点时,比较当前节点的值与prev的值,如果当前节点的值小于等于prev的值,则二叉树不是有效的二叉搜索树。
  • 4、更新prev的值为当前节点的值。
  • 5、递归遍历左右子树,直到所有节点都遍历完毕

java实现1

public class IsValidBST {static class TreeNode {int val;TreeNode left;TreeNode right;TreeNode(int val) {this.val = val;}}TreeNode prev = null;public boolean isValidBST(TreeNode root) {return isValidBSTHelper(root);}private boolean isValidBSTHelper(TreeNode root) {if (root == null) {return true;}// 判断左子树if (!isValidBSTHelper(root.left)) {return false;}// 当前节点值与前一个节点值比较if (prev != null && root.val <= prev.val) {return false;}prev = root;// 判断右子树return isValidBSTHelper(root.right);}// 测试示例public static void main(String[] args) {IsValidBST validator = new IsValidBST();// 构造一个有效的二叉搜索树//    4//   / \//  2   5// /   / \// 1   3  6
//        TreeNode root = new TreeNode(4);
//        root.left = new TreeNode(2);
//        root.right = new TreeNode(5);
//        root.left.left = new TreeNode(1);
//        root.right.left = new TreeNode(3);
//        root.right.right = new TreeNode(6);
//        // 判断是否是有效的二叉搜索树
//        boolean isValid = validator.isValidBST(root);
//        System.out.println("Is the tree a valid BST? " + isValid);//    5//   / \//  2   7// / \ / \// 1 3 6  8//    \//     4TreeNode root2 = new TreeNode(5);root2.left = new TreeNode(2);root2.right = new TreeNode(7);root2.left.left = new TreeNode(1);root2.left.right = new TreeNode(3);root2.right.right = new TreeNode(4);root2.right.left = new TreeNode(6);root2.right.right = new TreeNode(8);boolean isValid2 = validator.isValidBST(root2);System.out.println("Is the tree a valid BST? " + isValid2);}
}

解题思路2

使用递归的思路来判断是否是有效的二叉搜索树。

  • 1、对于每个节点,都有一个取值范围(上界和下界),它的左子树节点的值应该在当前节点值的下界到当前节点值之间,而右子树节点的值应该在当前节点值到上界之间。
  • 2、初始时,根节点的取值范围是负无穷到正无穷。在递归过程中,
  • 不断地更新每个节点的取值范围,并判断其左右子树是否符合要求。
  • 3、如果左右子树都符合,那么当前节点是有效的。在递归的过程中,
  • 如果某个节点的值超出了取值范围,则说明不是有效的二叉搜索树。

Java实现2

public class IsValidBST {static class TreeNode {int val;TreeNode left;TreeNode right;TreeNode(int val) {this.val = val;}}public boolean isValidBST(TreeNode root) {return isValidBST(root, Long.MIN_VALUE, Long.MAX_VALUE);}private boolean isValidBST(TreeNode node, long lower, long upper) {if (node == null) {return true;}//    7//   / \//  3   9// / \ / \// 1 5 8  10//  / \//  4  6if (node.val <= lower || node.val >= upper) {return false;}return isValidBST(node.left, lower, node.val) && isValidBST(node.right, node.val, upper);}// 测试示例public static void main(String[] args) {IsValidBST validator = new IsValidBST();// 构造一个有效的二叉搜索树//    4//   / \//  2   5// /   / \// 1   3  6
//        TreeNode root = new TreeNode(4);
//        root.left = new TreeNode(2);
//        root.right = new TreeNode(5);
//        root.left.left = new TreeNode(1);
//        root.right.left = new TreeNode(3);
//        root.right.right = new TreeNode(6);
//        // 判断是否是有效的二叉搜索树
//        boolean isValid = validator.isValidBST(root);
//        System.out.println("Is the tree a valid BST? " + isValid);//    5//   / \//  2   7// / \ / \// 1 3 6  8//    \//     4TreeNode root2 = new TreeNode(5);root2.left = new TreeNode(2);root2.right = new TreeNode(7);root2.left.left = new TreeNode(1);root2.left.right = new TreeNode(3);root2.right.right = new TreeNode(4);root2.right.left = new TreeNode(6);root2.right.right = new TreeNode(8);boolean isValid2 = validator.isValidBST(root2);System.out.println("Is the tree a valid BST? " + isValid2);}
}

时间空间复杂度

  • 时间复杂度:O(n),其中n是二叉树中的节点数,每个节点都需要访问一次。
  • 空间复杂度:O(height),递归调用栈的深度为树的高度

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

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

相关文章

Unity照片墙简易圆形交互效果总结

还要很多可以优化的点地方&#xff0c;有兴趣的可以做 比如对象的销毁和生成可以做成对象池&#xff0c;走到最左边后再移动到最右边循环利用 分析过程文件&#xff0c;采用Blender&#xff0c;资源已上传&#xff0c;可以播放动画看效果&#xff0c;下面截个图&#xff1a; …

Redis开源协议变更!Garnet:微软开源代替方案?

Garnet&#xff1a;微软开源的高性能替代方案&#xff0c;秉承兼容 RESP 协议的同时&#xff0c;以卓越性能和无缝迁移能力重新定义分布式缓存存储&#xff01; - 精选真开源&#xff0c;释放新价值。 概览 最近&#xff0c;Redis修改了开源协议&#xff0c;从BSD变成了 SSPLv…

主流公链 - Filecoin

探索Filecoin&#xff1a;去中心化存储网络 1. Filecoin简介 Filecoin是一个去中心化的存储网络&#xff0c;旨在通过区块链技术实现全球性的分布式文件存储和检索市场。Filecoin允许用户将文件存储在网络中的节点上&#xff0c;并通过加密、分片和复制等技术保证数据的安全性…

八大技术趋势案例(虚拟现实增强现实)

科技巨变,未来已来,八大技术趋势引领数字化时代。信息技术的迅猛发展,深刻改变了我们的生活、工作和生产方式。人工智能、物联网、云计算、大数据、虚拟现实、增强现实、区块链、量子计算等新兴技术在各行各业得到广泛应用,为各个领域带来了新的活力和变革。 为了更好地了解…

【数学符合】

数学符合 ■ ∑ ■ ∑

Javascript — 异步方法与异常捕获问题

问题&#xff1a;try catch为什么不能捕获未被 await 修饰的异步方法异常 async function throwError() {throw new Error("自定义Error&#xff01;") }let testOne async () > {console.debug("start testOne")try {throwError()} catch (e) {conso…

HSF:阿里RPC框架

简介 HSF&#xff08;High-speed Service Framework&#xff09;是一种广泛应用于阿里巴巴内部的分布式RPC服务框架。 作为阿里巴巴的基础中间件&#xff0c;HSF连接了不同的业务系统&#xff0c;解耦了系统间的实现依赖。HSF从分布式应用的角度统一了服务的发布和调用方式&a…

智慧工地安全生产与风险预警大平台的构建,需要哪些技术?

随着科技的不断发展&#xff0c;智慧工地已成为现代建筑行业的重要发展趋势。智慧工地方案是一种基于先进信息技术的工程管理模式&#xff0c;旨在提高施工效率、降低施工成本、保障施工安全、提升施工质量。一般来说&#xff0c;智慧工地方案的构建&#xff0c;需要通过集成物…

Rust编程(五)终章:查漏补缺

闭包 & 迭代器 闭包&#xff08;Closure&#xff09;通常是指词法闭包&#xff0c;是一个持有外部环境变量的函数。外部环境是指闭包定义时所在的词法作用域。外部环境变量&#xff0c;在函数式编程范式中也被称为自由变量&#xff0c;是指并不是在闭包内定义的变量。将自…

OpenHarmony中的LLDB高性能调试器

概述 LLDB&#xff08;Low Lever Debugger&#xff09;是新一代高性能调试器。详细说明参考 LLDB官方文档 。 当前OpenHarmony中的LLDB工具是在 llvm15.0.4 基础上适配演进出来的工具&#xff0c;是HUAWEI DevEco Studio工具中默认的调试器&#xff0c;支持调试C和C应用。 工…

将ENVI的roi转为mask图像

方法1&#xff1a; 直接使用ENVI step1: 将roi文件存储为.roi格式 [1] 链接: link step2: 将.roi转为mask [2] 链接: link [3] 链接: link 方法2&#xff1a; 使用Matlab step1: 将roi文件存储为.xlm 文件 step2&#xff1a;针对把每个roi存储为一个单独文件 [4] 读取xlm文…

【React】onClick点击事件传参的4种方式

记录React onClick 点击事件传参的 4 种方式 方式一&#xff1a;使用内联箭头函数 import React, { MouseEvent } from "react";function App() {const handleClick (event: MouseEvent<HTMLButtonElement>, name: string) > {console.log(event)console.…