【力扣题解】P530-二叉搜索树的最小绝对差-Java题解

花无缺

👨‍💻博客主页:@花无缺
欢迎 点赞👍 收藏⭐ 留言📝 加关注✅!
本文由 花无缺 原创

收录于专栏 【力扣题解】


文章目录

  • 【力扣题解】P530-二叉搜索树的最小绝对差-Java题解
    • 🌏题目描述
    • 💡题解
    • 🌏总结


【力扣题解】P530-二叉搜索树的最小绝对差-Java题解

P530-二叉搜索树的最小绝对差

🌏题目描述

给你一个二叉搜索树的根节点 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

💡题解

递归法1

List<Integer> list = new ArrayList<>();
public int getMinimumDifference(TreeNode root) {
    // 中序遍历二叉搜索树, 将中序序列保存在列表 list 中
    dfs(root);
    // 遍历 list, 获取最小差值
    int res = Integer.MAX_VALUE;
    for (int i = 0; i < list.size() - 1; i++) {
        int temp = list.get(i + 1) - list.get(i);
        if (res > temp) {
            res = temp;
        }
    }
    return res;
}
public void dfs(TreeNode root) {
    if (root == null) {
        return;
    }
    dfs(root.left);
    list.add(root.val);
    dfs(root.right);
}

递归法2

public int getMinimumDifference(TreeNode root) {
    dfs(root);
    return result;
}
int result = Integer.MAX_VALUE;
// pre 保存上一个遍历的节点
TreeNode pre = null;
public void dfs(TreeNode root) {
    if (root == null) {
        return;
    }
    dfs(root.left);
    // 将当前节点和上一个遍历的节点的差值与 result 的较小值赋给 result
    if (pre != null) {
        result = Math.min(result, root.val - pre.val);
    }
    // 当前节点变为 pre 节点
    pre = root;
    dfs(root.right);
}

迭代法

public int getMinimumDifference(TreeNode root) {
    int res = Integer.MAX_VALUE;
    Deque<TreeNode> stack = new LinkedList<>();
    TreeNode cur = root;
    // pre 保存上一个遍历的节点
    TreeNode pre = null;
    while (!stack.isEmpty() || cur != null) {
        if (cur != null) {
            stack.offerLast(cur);
            cur = cur.left;
        } else {
            cur = stack.pollLast();
            // 将当前节点和上一个遍历的节点的差值与 result 的较小值赋给 result
            if (pre != null) {
                res = Math.min(res, cur.val - pre.val);
            }
            // 当前节点变为 pre 节点
            pre = cur;
            cur = cur.right;
        }
    }
    return res;
}

时间复杂度均为:O(n),遍历了二叉树的 n 个节点。

🌏总结

这个题要求二叉搜索树种所有节点的任意两个节点差值的最小值,首先我们知道如果要求一个序列的两元素的最小差值的方法是先将序列进行排序,然后再枚举最小差值,其实此题目也可以运用一样的思路,最简单的做法就是遍历这棵二叉搜索树,将所有节点值加入一个数组,然后对数组进行排序,再枚举最小差值,这完全可以解决这个问题。但是我们应该充分利用二叉搜索树的性质,二叉搜索树的中序序列就是从小到大排序的序列,所以我们直接使用中序遍历二叉树,并获取最小差值。

递归 1 使用了一个数组来保存所有节点值,然后进行枚举。而递归 2 方法则使用一个临时节点变量来保存上一个遍历过的节点,然后进行比较,最后得出最小值。迭代法则是使用栈模拟了递归 2 的过程。

作者:花无缺(huawuque404.com)


🌸欢迎关注我的博客:花无缺-每一个不曾起舞的日子都是对生命的辜负~
🍻一起进步-刷题专栏:【力扣题解】
🥇往期精彩好文:
📢【全网最全爱心代码仓库】
📢【CSS选择器全解指南】
📢【HTML万字详解】
你们的点赞👍 收藏⭐ 留言📝 关注✅
是我持续创作,输出优质内容的最大动力!
谢谢!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Casper Network 推出 “DevRewards” 计划:允许所有开发者赚取激励

Casper Association 是一个致力于推动区块链大规模采用的非营利组织&#xff0c;该组织在 Casper Network 系统中推出了一个被称为 “DevRewards ” 的奖励计划&#xff0c;旨在邀请开发者提交能够解决现有问题的创新技术方案&#xff0c;以帮助 Casper Network 系统进一步完善…

modelsim安装使用

目录 modelsim 简介 modelsim 简介 ModelSim 是三大仿真器公司之一mentor的产品&#xff0c;他可以模拟行为、RTL 和门级代码 - 通过独立于平台的编译提高设计质量和调试效率。单内核模拟器技术可在一种设计中透明地混合 VHDL 和 Verilog&#xff0c;常用在fpga 的仿真中。 #…

初探Listener内存马

Listener基础 配置Listener . xml配置 流程分析 读取配置文件 读取web.xml&#xff0c;处理后将信息存储在webXml中 配置context 直接遍历并添加至addApplication中 以上步骤就是将webxml中的listener相关的数据添加到ApplicationListener 接下来直接跟进到listenerStart …

【VRTK】【VR开发】【Unity】18-VRTK与Unity UI控制的融合使用

课程配套学习项目源码资源下载 https://download.csdn.net/download/weixin_41697242/88485426?spm=1001.2014.3001.5503 【背景】 VRTK和Unity自身的UI控制包可以配合使用发挥效果。本篇就讨论这方面的实战内容。 之前可以互动的立体UI并不是传统的2D UI对象,在实际使用中…

主成分分析(PCA):探索数据的核心

文章目录 前言1. 什么是 PCA &#xff1f;2. PCA 的原理2.1 协方差和方差2.2 核心思想2.3 步骤 3. PCA 的应用场景4. PCA 的优缺点5. 示例&#xff1a;人脸识别5.1 完整代码5.2 运行结果 结语 前言 当今社会&#xff0c;数据无处不在。从社交媒体到金融交易&#xff0c;从医疗…

SpringBoot解决跨域的5种方式

本文来说下SpringBoot中实现跨域的5种方式。 文章目录 什么是跨域java解决CORS跨域请求的方式 返回新的CorsFilter(全局跨域)重写WebMvcConfigurer(全局跨域)使用注解 (局部跨域)手动设置响应头(局部跨域)使用自定义filter实现跨域 本文小结 什么是跨域 跨域&#xff1a;指的…

在FC中手工创建虚拟机模板

1、Linux去除个性化信息 &#xff08;1&#xff09;编辑网卡配置文件&#xff0c;只保留以下内容&#xff08;以RHEL 7为例&#xff09; &#xff08;2&#xff09;清除主机密钥信息&#xff08;开机会自动生成&#xff09; &#xff08;3&#xff09;清除Machine ID&#xff…

Java智慧工地管理平台系统源码带APP端源码

智慧工地将“互联网”的理念和技术引入建筑工地&#xff0c;从施工现场源头抓起&#xff0c;最大程度地收集人员、安全、环境、材料等关键业务数据&#xff0c;依托物联网、互联网&#xff0c;建立云端大数据管理平台&#xff0c;形成“端云大数据”的业务体系和新的管理模式&a…

JAVA反序列化之URLDNS链分析

简单介绍下urldns链 在此之前最好有如下知识&#xff0c;请自行bing or google学习。 什么是序列化 反序列化 &#xff1f;特点&#xff01; java对象反射调用&#xff1f; hashmap在java中是一种怎样的数据类型&#xff1f; dns解析记录有那…

Phind-CodeLlama-34B-v2 + Excel + Python 超强组合玩转数据分析

Phind-CodeLlama-34B-v2 Excel Python 超强组合玩转数据分析 0. 背景1. 使用 Phind-CodeLlama-34B-v2 pandas 实现数据导入和导出1.1 使用 Phind-CodeLlama-34B-v2 pandas 导入 Excel 文件中的数据1.2 使用 Phind-CodeLlama-34B-v2 pandas 读取部分Excel文件数据 2. 使用 …

Origin 2021软件安装包下载及安装教程

Origin 2021下载链接&#xff1a;https://docs.qq.com/doc/DUnJNb3p4VWJtUUhP 1.选中下载的压缩包&#xff0c;然后鼠标右键选择解压到"Origin 2021"文件夹 2.双击打开“Setup”文件夹 3.选中“Setup.exe”鼠标右键点击“以管理员身份运行” 4.点击“下一步" 5…

C ++类

定义一个Person类&#xff0c;私有成员int age&#xff0c;string &name&#xff0c;定义一个Stu类&#xff0c;包含私有成员double *score&#xff0c;写出两个类的构造函数、析构函数、拷贝构造和拷贝赋值函数&#xff0c;完成对Person的运算符重载(算术运算符、条件运算…

每个AI/ML工程师必须了解的人工智能框架和工具

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

【SpringCloud Alibaba笔记】(2)Nacos服务注册与配置中心

Nacos Nacos简介与下载 是什么&#xff1f; 一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 Nacos&#xff08;Dynamic Naming and Configuration Service&#xff09;就是注册中心&#xff0b;配置中心的组合 Nacos Eureka Config Bus 替代Eureka…

vscode配置的C++环境

目录 1、下载并安装VScode 2、下载MinGW 3、配置MinGW 3.1添加环境变量 3.2 Vscode配置 3.3测试 1、下载并安装VScode Visual Studio Code - Code Editing. Redefined 2、下载MinGW 在MinGW官网MinGW-w64 - for 32 and 64 bit Windows - Browse /mingw-w64/mingw-w64-r…

OpenOCD简介和下载安装(Ubuntu)

文章目录 OpenOCD简介OpenOCD软件模块OpenOCD源码下载OpenOCD安装 OpenOCD简介 OpenOCD&#xff08;Open On-Chip Debugger&#xff09;开放式片上调试器 OpenOCD官网 https://openocd.org/&#xff0c;进入官网点击 About 可以看到OpenOCD最初的设计是由国外一个叫Dominic Ra…

VC++ ado 实现单表CURD

继续修改前文的资产管理源码; 新建一个数据库sds;把代码中的数据库连接改为连接此库; 新建下图一个表; 把之前的资产类别管理对话框改为下图所示;对话框ID也改为下图; 资产类别管理菜单和ID改为下图; 直接修改资产类别管理对话框类不太方便,新建一个对话框类,没有关联…

FA模板制作流程

1、FA模板制作的流程&#xff08;完整复制模板制作&#xff09; 总结&#xff1a; FA完整复制云桌面模板流程&#xff1a; 1、安装一个全新的Windows&#xff0c;挂载并安装tools 2、关闭防火墙、启动administrator本地超管用户 3、挂载FusionAccess_WindowsDesktop_Instal…

【unity学习笔记】捏人+眨眼效果+口型效果

一、vriod捏人 1.在vroidstudio软件中捏人 2.导出模型&#xff08;.vrm) 二、vrid导入unity的插件 1.在Git上搜索、打开univrm。 2.找到release页面找到合适的插件版本。&#xff08;VRM-0.116.0_0f6c&#xff09; 3.将univrm导入到工程中&#xff08;assets&#xff09;。 三…

rosdep init/update失败+rosdep 初始化脚本

我等会给你们开源一个python脚本&#xff0c;自动修改&#xff1a;并且把源代码发到博客里面 注意了使用这个脚本的前提是安装sudo apt install python3-rosdep2;否则文件夹就不对了 #rosdep初始化软件无界面 def replacex():addr1addrfiopen(addr1,r)contfi.read()contcont.…
最新文章