二叉搜索树的最小绝对差[简单]

news2024/11/17 11:23:58

优质博文:IT-BLOG-CN

一、题目

给你一个二叉搜索树的根节点root,返回树中任意两不同节点值之间的最小差值。差值是一个正数,其数值等于两值之差的绝对值。

示例 1:

输入:root = [4,2,6,1,3]
输出:1

示例 2:

输入:root = [1,0,48,null,null,12,49]
输出:1

树中节点的数目范围是[2, 104]
0 <= Node.val <= 105

二、代码

考虑对升序数组a求任意两个元素之差的绝对值的最小值,答案一定为相邻两个元素之差的最小值,本题要求二叉搜索树任意两节点差的绝对值的最小值,而我们知道二叉搜索树有个性质为二叉搜索树中序遍历得到的值序列是递增有序的,因此我们只要得到中序遍历后的值序列就可以在中序遍历的过程中用pre变量保存前驱节点的值,这样即能边遍历边更新答案,不再需要显式创建数组来保存,需要注意的是pre的初始值需要设置成任意负数标记开头,下文代码中设置为−1

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    int minVal;
    // 定义临时变量,存储相邻节点,因为val都是正整数,所以使用-1表示第一次存储
    int pre;
    public int getMinimumDifference(TreeNode root) {
        // 定义一个最小值,不断的迭代进行判断
        minVal = Integer.MAX_VALUE;
        pre = -1;
        dfs(root);
        return minVal;
    }

    private void dfs(TreeNode root) {
        // 递归退出条件
        if (root == null) {
            return;
        }
        // 中序遍历数据,先遍历左子树
        dfs(root.left);
        if (pre == -1) {
            pre = root.val;
        } else {
            // 因为是从小到大顺序遍历,所以无需绝对值
            minVal = Math.min(minVal, root.val - pre);
            pre = root.val;
        }
        dfs(root.right);
    }
}

时间复杂度: O(n)其中n为二叉搜索树节点的个数。每个节点在中序遍历中都会被访问一次且只会被访问一次,因此总时间复杂度为O(n)
空间复杂度: O(n)递归函数的空间复杂度取决于递归的栈深度,而栈深度在二叉搜索树为一条链的情况下会达到O(n)级别。

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

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

相关文章

K8s集群

统一时间&#xff1a;ntpdate(都做) ntpdate -b ntp1.aliyun.com */1 * * * * /usr/sbin/ntpdate -b ntp1.aliyun.com systemctl status docker vi /etc/docker/daemon.json systemctl restart docker m: vim kubernetes.sh cat >> /etc/yum.repos.d/kubernetes.repo…

Unity中Shader的全局照明简介

文章目录 前言一、什么是全局照明GI1、全局照明&#xff08;Global Illumination&#xff09;&#xff0c;简称GI2、指既考虑场景中直接光源的光照&#xff08;Direct Light&#xff09;又考虑经过场景中其他物体反射后的光照&#xff08;Indirect Light&#xff09;的一种渲染…

小红书关键词类型有哪些,如何布局搜索流量?

通过搜索关键词寻找到关注的内容&#xff0c;是大部分小红书用户的浏览习惯。因此作为品牌方&#xff0c;找准搜索的关键词&#xff0c;并合理嵌入内容中&#xff0c;就显得尤为重要。今天为大家分享下小红书关键词类型有哪些&#xff0c;如何布局搜索流量&#xff1f; 一、关键…

加速生态培育,国产CPU走到哪了?

国产大飞机C919的成功商飞&#xff0c;证明我国已经拥有了设计制造大飞机的能力。继高铁、盾构机等多个领域后&#xff0c;再次证明即使是技术后来者&#xff0c;通过在起步阶段引进关键技术&#xff0c;吸收消化后&#xff0c;自主研发不断发展前行&#xff0c;这条“引进吸收…

智慧粮库挡粮门异动监测

我国以往粮食收储设施比较老化&#xff0c;如何减少粮食在存储运输过程中的人为因素&#xff0c;确保粮食安全&#xff0c;成为亟待解决的问题&#xff0c;为了减少粮食的损失&#xff0c;“智慧粮库”的建设在我国有着重要意义。“智慧粮库”充分利用物联网、人工智能等技术&a…

自定义点云的数据类型PointXYZIRT

PCL支持的点云数据类型有PointXYZ、PointXYZI等&#xff0c;但是对于速腾、Velodyne等激光雷达的原始点云中还包含了激光点线号ring和每个激光点的时间戳信息&#xff0c;在读取该类点云时需要基于PCL库自定义点云格式才能读到原始点云的所有信息&#xff0c;以速腾激光雷达点云…

回归测试:在不断变化的环境中确保软件的稳定性

软件开发是一个复杂的过程&#xff0c;需要不断变化和更新以满足客户不断变化的需求&#xff0c;但它们也可能产生新问题或导致旧问题重新出现。这就是回归测试的用武之地——它是在不断变化的环境中确保软件稳定性的重要组成部分。 在这篇文章中&#xff0c;我们将深入探讨什…

开放式耳机推荐排行榜、开放式耳机性价比推荐

随着无线耳机越来越普及&#xff0c;人们对于耳机的要求也越来越高。传统的入耳式耳机虽然音质好&#xff0c;但是长时间佩戴容易引起耳部不适&#xff0c;甚至可能导致听力损失。为此大家都开始选择入手舒适、安全的开放式耳机&#xff0c;现在耳机市场&#xff0c;各种品牌、…

*VS Code中的Ajax

下载插件并使用 下载插件,开放一个端口给要加载的资源&#xff0c;解决跨域问题&#xff0c;没有后端接收数据&#xff0c;用来做小模块很合适 建立文件夹&#xff0c;文件夹下放入jquery插件和json文件 data.json {"total": 4,"data": [{"name&qu…

11、SpringCloud -- 利用redis优化查询秒杀商品的数据(就是可以把商品数据先存到redis中)

目录 秒杀商品数据存到redis中并查询需求hash理解代码&#xff1a;RedisService商品数据初始化&#xff1a;查询 测试&#xff1a; 秒杀商品数据存到redis中并查询 需求 利用redis优化查询秒杀商品的数据&#xff0c;就是可以把商品数据先存到redis中&#xff0c;要查的时候先…

springboot整合日志,并在本地查看

目录 1.导入依赖 2.编写配置 3.使用 4.验证 5.打印错误信息 1.导入依赖 <!-- logback&#xff0c;向下兼容log4j,还支持SLF4J--> <dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId> </depen…

IPv6地址配置方式

IPv6地址分类 IPv6地址分为单播地址、任播地址&#xff08;Anycast Address&#xff09;、组播地址三种类型。和IPv4相比&#xff0c;取消了广播地址类型&#xff0c;以更丰富的组播地址代替&#xff0c;同时增加了任播地址类型。 单播地址 IPv6单播地址标识了一个接口&…

桶装水送水多门店水票押金押桶小程序开发

桶装水送水多门店水票押金押桶小程序开发 用户注册和登录首页展示各门店的桶装水品牌和价格用户可以选择门店和水品牌&#xff0c;并下单购买桶装水用户可以选择送水时间和地址用户可以查看自己的订单历史和当前订单状态用户可以申请退款或修改订单信息门店可以登录后台管理系…

毕业设计基于SpringBoot+Vue智慧云办公系统源码+数据库+项目文档

智慧云办公管理系统 一、系统简介 智慧云办公系统是一个采用SpringBootVue技术开发的前后端分离的项目&#xff0c;云办公系统通过软件的方式&#xff0c;方便快捷处理中小型企业的公司日常事务&#xff0c;能够提高整体的管理运营水平&#xff0c;使得办公更加高效方便&…

WebDAV之π-Disk派盘 + 读出通知

手机各种推销通知太多,如何避免那些繁琐的通知内容,做出一键就能够阅读重要通知的最佳体验,帮助您更加快速和便捷的体验到那些应用内容?推荐大家使用读出通知。 读出通知APP可以设置接收通知的app,还可以用耳机操作,操作简单,你还可以指定播报设备,还有播报的声音的设置…

大数据四大阵营

一、OLTP 阵营 OLTP&#xff08;在线事务、交易处理&#xff09;&#xff1a;RDBMS( Relational Database Management System)、NoSQL、NewSQL OLTP阵营可以分为&#xff1a; 传统的关系型数据库NoSQLNewSQL 1、NoSQL NoSQL类系统普遍存在下面一些共同特征&#xff1a; 不需…

草柴返利APP如何领取天猫淘宝红包优惠券享淘礼金红包0元购物福利?

什么是草柴返利APP&#xff1f; 草柴APP是一款淘宝/天猫、京东等电商平台购物前查询领取大额内部隐藏优惠券&#xff0c;确认收货后拿购物返利的省钱工具。同时&#xff0c;草柴APP上线隐藏的红包功能&#xff0c;查询到淘宝/天猫、京东商品优惠券、返利结果&#xff0c;点击进…

uniapp @click点击事件在新版chrome浏览器点击没反应

问题描述 做项目时&#xff0c;有一个弹出选择的组件&#xff0c;怎么点都不出来&#xff0c;最开始还以为是业务逻辑限制了不能点击。后来才发现别人的电脑可以点出来&#xff0c;老版本的浏览器也可以点出来&#xff0c;最后定位到是新版的chrome就不行了 这是我的浏览器版本…

postman使用POST,却收到的是GET请求

现象&#xff1a; 可以看到我们postman发出的确实是post请求&#xff0c;message却报错这个接口不支持get请求&#xff0c;说明服务器实际上收到的是一个get请求。 产生原因分析 如果我们访问的是线上的接口&#xff0c;线上的nginx一般都会对http访问做一个302重定向&#xf…

掌握Google Play上的应用商店优化

对于Google Play而言&#xff0c;ASO不仅可以提高我们的应用程序的可见性&#xff0c;还可以对我们的应用在应用商店搜索结果中的性能产生深远的影响。 1、应用商店优化在Google Play中的作用。 能够增强应用在Google Play商店搜索结果中的性能并提高点击率 。在优化过程涉及各…