二叉树——530.二叉搜索树的最小绝对差

简介: 本专栏按照数组—链表—哈希—字符串—栈与队列—二叉树—回溯—贪心—动态规划—单调栈的顺序刷题,采用代码随想录所给的刷题顺序,一个正确的刷题顺序对算法学习是非常重要的,希望对大家有帮助

1 题目描述

给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值 。

差值是一个正数,其数值等于两值之差的绝对值。

本题与783. 二叉搜索树节点最小距离 其实是同一个题

2 题目示例

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

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

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/minimum-absolute-difference-in-bst

3 题目提示

树中节点的数目范围是 [2, 10^4]
0 <= Node.val <= 10^5

4 思路

考虑对升序数组 aa 求任意两个元素之差的绝对值的最小值,答案一定为相邻两个元素之差的最小值,即
image.png

其中n为数组α的长度。其他任意间隔距离大于等于2的下标对(i,j)的元素之差—定大于下标对(i,i+1)的元素之差,故不
要再被考虑。
回到本题,本题要求二叉搜索树任意两节点差的绝对值的最小值,而我们知道二叉搜索树有个性质为二叉搜索树中序遍历得到的值序列是递增有序的,因此我们只要得到中序遍历后的值序列即能用上文提及的方法来解决。
朴素的方法是经过—次中序遍历将值保存在一个数组中再进行遍历求解,我们也可以在中序遍历的过程中用pre变量保存前驱节点的值,这样即能边遍历边更新答案,不再需要显式创建数组来保存,需要注意的是pre的初始值需要设置成任意负数标记开头,下文代码中设置为-1。
复杂度分析
时间复杂度:O(n),其中n为二叉搜索树节点的个数。每个节点在中序遍历中都会被访问一次且只会被访问一次,因此总时间复杂度为O(n)。
空间复杂度:O(n)。递归函数的空间复杂度取决于递归的栈深度,而栈深度在二叉搜索树为—条链的情况下会达到O(n)级别。

5 我的答案

class Solution {
    int pre;
    int ans;

    public int getMinimumDifference(TreeNode root) {
        ans = Integer.MAX_VALUE;
        pre = -1;
        dfs(root);
        return ans;
    }

    public void dfs(TreeNode root) {
        if (root == null) {
            return;
        }
        dfs(root.left);
        if (pre == -1) {
            pre = root.val;
        } else {
            ans = Math.min(ans, root.val - pre);
            pre = root.val;
        }
        dfs(root.right);
    }
}
相关文章
|
2月前
|
Kubernetes Ubuntu Docker
Kubernetes安装详细教程 RHEL系列版
本教程基于Rocky Linux 9.5配置Kubernetes环境,涵盖系统准备、containerd安装、K8S组件部署及CNI网络插件配置,其中包含国内镜像加速与集群初始化。
|
17天前
|
机器学习/深度学习 人工智能 自然语言处理
RPA江湖兵器谱:2025年最火机器人流程自动化软件大盘点
RPA机器人流程自动化正成为企业数字化转型的关键工具,助力降本增效。本文全面解析2025年主流RPA软件,涵盖国际领军者、国产翘楚与特色厂商,技术优势与行业地位一目了然,助你精准选型避坑。
|
异构计算 SoC
最详细手把手教你安装 Vivado2018.3
最详细手把手教你安装 Vivado2018.3
1502 0
|
存储 监控 安全
内存卡数据恢复,3个方法帮你找回丢失的照片和视频
今天,针对内存卡数据恢复,本期做一个详细的归纳,分析常见的数据丢失原因、详细的数据恢复步骤、以及如何保护内存卡数据。
内存卡数据恢复,3个方法帮你找回丢失的照片和视频
|
人工智能 安全 物联网
智能家居的未来:物联网与AI的完美融合
本文深入探讨了物联网(IoT)和人工智能(AI)在智能家居领域的应用,并预测了未来技术的发展趋势。通过分析当前技术实现、面临的挑战以及潜在的解决方案,文章旨在为读者揭示一个更加智能、互联的家居生活蓝图。
295 1
|
运维 Cloud Native 持续交付
运维之道:从传统到云原生的演变之旅
在数字化时代,运维领域经历了翻天覆地的变化。本文将带领读者穿梭于时间的纬线,探索运维从传统模式到云原生技术演进的历程。我们将通过具体案例和数据分析,揭示这一转型如何优化企业IT架构,提高资源利用效率,并促进运维自动化与智能化。文章最后,我们会提出一个开放性问题,邀请读者共同思考运维未来的发展方向。
|
关系型数据库 Linux 网络安全
"Linux系统实战:从零开始部署Apache+PHP Web项目,轻松搭建您的在线应用"
【8月更文挑战第9天】Linux作为服务器操作系统,凭借其稳定性和安全性成为部署Web项目的优选平台。本文以Apache Web服务器和PHP项目为例,介绍部署流程。首先,通过包管理器安装Apache与PHP;接着创建项目目录,并上传项目文件至该目录;根据需要配置Apache虚拟主机;最后重启Apache服务并测试项目。确保防火墙允许HTTP流量,正确配置数据库连接,并定期更新系统以维持安全。随着项目复杂度提升,进一步学习高级配置将变得必要。
816 0
|
Python 存储
运营的小伙伴看过来,使用python处理批量视频文件
这段Python脚本用于批量处理MP4视频文件,将它们按每15个文件一组移动到新创建的文件夹中。首先,它导入os和shutil库,设置源文件夹路径及目标文件夹根路径。接着,遍历源路径中的视频文件,每移动15个文件后创建新的目标文件夹。完成后,输出“文件移动完成!”提示。
274 3
|
canal 关系型数据库 MySQL
Mysql数据库平滑扩容解决高并发和大数据量问题 1
Mysql数据库平滑扩容解决高并发和大数据量问题
545 0
|
SQL 关系型数据库 MySQL
MySQL基本操作指南:从数据库创建到数据操作
本文深入探讨了MySQL数据库的基本操作,涵盖了数据库的创建与删除、数据表的创建与删除、数据类型与约束,以及基本的数据操作语句。读者将了解如何使用SQL语句来创建数据库、数据表,并定义不同类型的数据字段及其约束。此外,本文还详细介绍了数据的插入、查询、更新和删除操作,为读者提供了在MySQL中进行数据管理的基本技能。通过掌握这些关键操作,读者将能够有效地操作MySQL数据库,为应用程序的开发和数据管理提供了可靠的基础。
612 0