学习记录:js算法(五十二):验证二叉搜索树

news2024/10/3 21:07:38

文章目录

    • 验证二叉搜索树
      • 我的思路
      • 网上思路
    • 总结

验证二叉搜索树

给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。
有效 二叉搜索树定义如下:
节点的 左子树 只包含 小于 当前节点的数。
节点的 右子树 只包含 大于 当前节点的数。
所有左子树和右子树自身必须也是 二叉搜索树

图一:
在这里插入图片描述

图二:
在这里插入图片描述

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

示例 2:如图二
输入:root = [5,1,4,null,null,3,6]
输出:false
解释:根节点的值是 5 ,但是右子节点的值是 4

我的思路
递归
网上思路
使用栈来模拟中序遍历

我的思路

var isValidBST = function (root, min, max) {
    if (!root) return true; // 空树满足条件
    // 当前节点值不在合法范围内,说明不满足二叉搜索树的定义
    if (root.val <= min || root.val >= max) return false;
    // 递归检查左子树和右子树
    return (
        isValidBST(root.left, min, root.val) && // 左子树的最大值应小于当前节点值
        isValidBST(root.right, root.val, max) // 右子树的最小值应大于当前节点值
    );
};

讲解
我们可以采用递归的方式来验证一个二叉树是否是有效的二叉搜索树。递归函数需要传递三个参数:当前节点、左边界(最小值)和右边界(最大值)。每次递归调用时,都会根据当前节点的值与边界值的关系来判断是否违反了二叉搜索树的规则,并相应地更新左右子树的边界。

  1. 基本情况:如果当前节点为空,直接返回true,因为空树也视为有效二叉搜索树。
  2. 递归条件:
    • 当前节点的值需要满足在其父节点设定的范围内,即大于左边界且小于右边界。
    • 递归检查左子树,此时左子树的右边界应为当前节点的值(因为左子树的节点值都应小于当前节点)。
    • 递归检查右子树,此时右子树的左边界应为当前节点的值(因为右子树的节点值都应大于当前节点)。
  3. 递归结束:当所有节点都满足上述条件时,整个树就是有效的二叉搜索树。

网上思路

var isValidBST = function (root, min, max) {
    const stack = []; // 用于模拟栈
    let current = root; // 当前节点
    let prevValue = null; // 上一个节点值
    while (stack.length > 0 || current) {
        // 遍历到最左边的节点
        while (current) {
            stack.push(current);
            current = current.left;
        }
        // 访问节点
        current = stack.pop();
        // 检查当前节点值是否大于上一个节点值
        if (prevValue !== null && current.val <= prevValue) {
            return false; // 不是有效的二叉搜索树
        }
        // 更新上一个节点值
        prevValue = current.val;
        // 继续遍历右子树
        current = current.right;
    }
    return true; // 如果遍历完没有问题,则是有效的二叉搜索树
};

讲解

  1. isValidBST 函数:
    • 使用一个栈 stack 来存储节点。
    • 使用 current 指针遍历树,并使用 prevValue 来记录上一个节点的值。
  2. 遍历过程:
    • 首先遍历到最左边的节点,并将所有经过的节点压入栈中。
    • 弹出栈顶节点并进行检查,确保当前节点的值大于上一个节点的值。
    • 更新 prevValue,然后继续遍历右子树。
  3. 返回结果:如果在遍历过程中发现不符合 BST 条件的节点,则返回 false,否则返回 true

总结

递归妙啊!

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

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

相关文章

【Python】AudioLazy:基于 Python 的数字信号处理库详解

AudioLazy 是一个用于 Python 的开源数字信号处理&#xff08;DSP&#xff09;库&#xff0c;设计目的是简化信号处理任务并提供更直观的操作方式。它不仅支持基础的滤波、频谱分析等功能&#xff0c;还包含了滤波器、信号生成、线性预测编码&#xff08;LPC&#xff09;等高级…

Mybatis框架梳理

Mybatis框架梳理 前言1.ORM2.模块划分2.1 ORM的实现2.2 SQL的映射2.3 插件机制2.4 缓存机制2.5 其他 3. 愿景 前言 如果让我聊一聊mybatis&#xff0c;我该怎么说呢&#xff1f;开发中时时刻刻都在用它&#xff0c;此时此刻&#xff0c;脑海中却只浮现ORM框架这几个字&#xff…

Linux --入门学习笔记

文章目录 Linux概述基础篇Linux 的安装教程 ⇒ 太简单了&#xff0c;百度一搜一大堆。此处略……Linux 的目录结构常用的连接 linux 的开源软件vi 和 vim 编辑器Linux 的关机、开机、重启用户登录和注销用户管理添加用户 ⇒ ( useradd 用户名 ) &#xff08; useradd -d 制定目…

【AIGC】内容创作——AI文字、图像、音频和视频的创作流程

我的主页&#xff1a;2的n次方_ 近年来&#xff0c;生成式人工智能&#xff08;AIGC&#xff0c;Artificial Intelligence Generated Content&#xff09;技术迅速发展&#xff0c;彻底改变了内容创作的各个领域。无论是文字、图像、音频&#xff0c;还是视频&#xff0c;A…

SPARK调优:AQE特性(含脑图总结)

学完AQE需要能够回答如下的几个问题&#xff1a; 什么是AQE&#xff1f;AQE的实现原理是什么&#xff1f;AQE的特性有哪些&#xff1f;使用什么参数实现&#xff1f;AQE每个特性可以解决什么问题&#xff1f;什么问题是AQE不能解决的 HL&#xff1a;学习脑图如下 SparkAQE是spa…

MES系统适用于哪些行业?MES系统对于企业的作用和价值

MES系统&#xff08;制造执行系统&#xff09;广泛应用于多个行业&#xff0c;并在这些行业中发挥着重要作用&#xff0c;为企业带来了显著的价值。以下是对MES系统适用行业及其对企业作用和价值的详细分析&#xff1a; 一、MES系统适用的行业 电子信息行业&#xff1a; 随着市…

大功率LED模块(5V STM32)

目录 一、介绍 二、模块原理 1.尺寸介绍 2.模块原理图 3.引脚描述 三、程序设计 main.c文件 timer.h文件 timer.c文件 四、实验效果 五、资料获取 项目分享 一、介绍 大功率LED模块是一种照明设备&#xff0c;它将大功率高亮度发光二极管(LED)集成在铝基板上&…

Linux学习笔记(二):深入理解用户管理、运行级别与命令行操作

Linux学习笔记&#xff08;二&#xff09;&#xff1a;深入理解用户管理、运行级别与命令行操作 Linux学习笔记&#xff08;一&#xff09;&#xff1a;Linux学习环境的安装及远程连接工具的使用 1. 用户管理 1.1 用户密码管理 创建用户密码 使用 passwd 命令可以为指定用户…

封装了一个iOS水平方向动态宽度layout

我们有时候会遇到这样的情形&#xff0c;就是需要展示一些动态的标签&#xff0c;宽度是动态的&#xff0c; 水平方向是一行&#xff0c;其实这种情况还是比较容易处理的&#xff0c;只是一下子想不起来&#xff0c; 这里做了一个相关的需求&#xff0c;将思路和代码记录下来&a…

第5章 总线与微命令实验

第5章 总线与微命令实验 5.1实验目的 &#xff08;1&#xff09;理解总线的概念和作用。 &#xff08;2&#xff09;连接运算器与存储器&#xff0c;熟悉计算机的数据通路。 &#xff08;3&#xff09;理解微命令与微操作的概念。 5.2实验要求 &#xff08;1&#xff09;做…

69 BERT预训练_by《李沐:动手学深度学习v2》pytorch版

系列文章目录 文章目录 系列文章目录NLP里的迁移学习Bert的动机Bert架构对输入的修改五、预训练任务1、2、3、 六、1、2、3、 七、1、2、3、 八、1、2、3、 NLP里的迁移学习 之前是使用预训练好的模型来抽取词、句子的特征&#xff0c;例如 word2vec 或语言模型这种非深度学习…

香酥胡麻饼 一口沦陷的传统美食

&#x1f96f;美食发现 | 胡麻饼&#xff0c;一口咬出的千年韵味&#x1f96f;&#x1f60b;宝子们&#xff0c;今天我要给大家分享一款超级有历史底蕴的美食 —— 食家巷胡麻饼。 ✨食家巷胡麻饼&#xff0c;那可是有着悠久历史的传统美食。在古代&#xff0c;它就备受人们喜…

【算法】链表:160.相交链表(easy)+双指针

系列专栏 《分治》 《模拟》 《Linux》 目录 1、题目链接 2、题目介绍 3、解法&#xff08;双指针&#xff09; 返回结果 算法正确性 时间复杂度 4、代码 1、题目链接 160. 相交链表 - 力扣&#xff08;LeetCode&#xff09; 2、题目介绍 ​ 3、解法&#xff08;…

MISC -第十天(音符加解密、敲击码、NtfsStreamsEditor工具)

前言 各位师傅大家好&#xff0c;我是qmx_07&#xff0c;今天继续讲解MISC的相关知识 [MRCTF2020]你能看懂音符吗 附件信息: rar文件无法打开&#xff0c;显示损坏&#xff0c;先放到hxd查看 头标识错误&#xff0c;尝试修复 rar标识头(52 61 72 21) 压缩包里有一个d…

4个顶级的大模型推理引擎

LLM 在文本生成应用中表现出色&#xff0c;例如具有高理解度和流畅度的聊天和代码完成模型。然而&#xff0c;它们的庞大规模也给推理带来了挑战。基本推理速度很慢&#xff0c;因为 LLM 会逐个生成文本标记&#xff0c;需要对每个下一个标记进行重复调用。随着输入序列的增长&…

【游戏模组】星际争霸1代模组燃烧之地,泰伦帝国对决UED。特效华丽兵种巨多特别好玩

各位星际争霸1代的粉丝大家好&#xff0c;今天小编给大家带来一个星际争霸1代的模组&#xff0c;这个模组的名字叫燃烧之地&#xff0c;主要是2个阵营。玩家可以扮演UED或者泰伦帝国中的一个来进行比赛。 这个模组设定的世界线背景是在异虫入侵并随后被星灵消灭后&#xff0c;…

昇思MindSpore进阶教程--梯度累加

大家好&#xff0c;我是刘明&#xff0c;明志科技创始人&#xff0c;华为昇思MindSpore布道师。 技术上主攻前端开发、鸿蒙开发和AI算法研究。 努力为大家带来持续的技术分享&#xff0c;如果你也喜欢我的文章&#xff0c;就点个关注吧 正文开始 本教程介绍梯度累加的训练算法…

C(十一)scanf、getchar(第三弹)

问题引入&#xff1a;如何实现输入一串密码&#xff0c;如&#xff1a;“123 xxxx” &#xff0c;然后读取并确认&#xff0c;是 -- Y&#xff1b;否 -- N。 自然的&#xff0c;我们想到用scanf&#xff0c;但是在使用过程中你是否遇到跟我一样的困惑呢&#xff1f;如下&…

【Linux】进程管理:状态与优先级调度的深度分析

✨ 山海自有归期&#xff0c;风雨自有相逢 &#x1f30f; &#x1f4c3;个人主页&#xff1a;island1314 &#x1f525;个人专栏&#xff1a;Linux—登神长阶 ⛺️ 欢迎关注&#xff1a;&#x1f44d;点赞 &#x1…

华为技术经理总结Java技术栈思维导图

最近帮在读大四的学生做了一个java项目&#xff0c;使用Spring bootVue3做了一个机器学习在线训练和服务的平台&#xff0c;发现他的Java技术栈并不全面&#xff0c;希望在下面分享一下Java技术栈&#xff0c;能够帮助到正在参加秋招或者是准备找工作的朋友们&#xff1a; 完整…