这是悦乐书的第253次更新,第266篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第120题(顺位题号是530)。给定具有非负值的二叉搜索树,找到任意两个节点的值之间的最小绝对差。例:

输入:

   1
\
3
/
2

输出:1

说明:最小绝对差值为1,即2和1之间(或2和3之间)的差值。

注意:此BST中至少有两个节点。

本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

02 第一种解法

题目的要求是任意两个节点值之间的绝对值最小,所以间接变成了求一组数据的最小绝对值。使用栈(或者队列)遍历所有节点,将所有节点值存入list中,然后将list转为Integer类型的数组,再将数组排序,然后计算相邻两元素的绝对值,找出其中的最小值。

public int getMinimumDifference(TreeNode root) {
List<Integer> list = new ArrayList<Integer>();
Stack<TreeNode> stack = new Stack<TreeNode>();
stack.push(root);
while (!stack.isEmpty()) {
TreeNode node = stack.pop();
if (node.left != null) {
stack.push(node.left);
}
list.add(node.val);
if (node.right != null) {
stack.push(node.right);
}
}
Integer[] nums = (Integer[])list.toArray(new Integer[list.size()]) ;
Arrays.sort(nums);
int min = Math.abs(nums[0]-nums[1]);
for (int i=0; i<nums.length-1; i++) {
min = Math.min(Math.abs(nums[i]-nums[i+1]), min);
}
return min;
}

03 第二种解法

我们可以利用BST的中序遍历特性,BST中序遍历的节点是左根右排列,是有序的、递增的一列数据。因此,我们可以利用递归方法,中序遍历其节点,计算其相邻两个节点值的绝对值。因此我们需要保留其前一个节点的节点值,使用一个全局变量来记录。如果prev为null,表示当前遍历到的为第一个节点,不为null的时候,就可以直接计算最小绝对值了。

Integer prev = null;
int min = 0;
public int getMinimumDifference2(TreeNode root) {
traverse(root);
return min;
} private void traverse(TreeNode root) {
if (root == null) {
return;
}
traverse(root.left);
if (prev != null) {
if (min == 0) {
min = Math.abs(root.val - prev);
} else {
min = Math.min(Math.abs(root.val - prev), min);
}
}
prev = root.val;
traverse(root.right);
}

04 第三种解法

第二种解法还可以再优化下,将递归方法内置,同时min初始值为int类型的最大值,而不是第二种解法的0,可以省去一步判断。

Integer prev2 = null;
int min2 = Integer.MAX_VALUE;
public int getMinimumDifference3(TreeNode root) {
if (root == null) {
return min2;
}
getMinimumDifference3(root.left);
if (prev2 != null) {
min2 = Math.min(Math.abs(root.val - prev2), min2);
}
prev2 = root.val;
getMinimumDifference3(root.right);
return min2;
}

05 小结

算法专题目前已日更超过三个月,算法题文章120+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

LeetCode算法题-Minimum Absolute Difference in BST(Java实现)的更多相关文章

  1. 【LeetCode】530. Minimum Absolute Difference in BST 解题报告(Java & Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 Java解法 Python解法 日期 题目地址:ht ...

  2. 51. leetcode 530. Minimum Absolute Difference in BST

    530. Minimum Absolute Difference in BST Given a binary search tree with non-negative values, find th ...

  3. 【leetcode_easy】530. Minimum Absolute Difference in BST

    problem 530. Minimum Absolute Difference in BST 参考 1. Leetcode_easy_530. Minimum Absolute Difference ...

  4. C#LeetCode刷题之#530-二叉搜索树的最小绝对差(Minimum Absolute Difference in BST)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4123 访问. 给定一个所有节点为非负值的二叉搜索树,求树中任意两 ...

  5. LeetCode 530. Minimum Absolute Difference in BST (二叉搜索树中最小绝对差)

    Given a binary search tree with non-negative values, find the minimum absolute difference between va ...

  6. LeetCode Minimum Absolute Difference in BST

    原题链接在这里:https://leetcode.com/problems/minimum-absolute-difference-in-bst/#/description 题目: Given a b ...

  7. [LeetCode] Minimum Absolute Difference in BST 二叉搜索树的最小绝对差

    Given a binary search tree with non-negative values, find the minimum absolute difference between va ...

  8. LeetCode算法题-Minimum Distance Between BST Nodes(Java实现-四种解法)

    这是悦乐书的第314次更新,第335篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第183题(顺位题号是783).给定具有根节点值的二叉搜索树(BST),返回树中任何两个 ...

  9. [LeetCode&Python] Problem 530. Minimum Absolute Difference in BST

    Given a binary search tree with non-negative values, find the minimum absolute difference between va ...

随机推荐

  1. 概率分布之间的距离度量以及python实现(三)

    概率分布之间的距离,顾名思义,度量两组样本分布之间的距离 . 1.卡方检验 统计学上的χ2统计量,由于它最初是由英国统计学家Karl Pearson在1900年首次提出的,因此也称之为Pearson ...

  2. 我的2017OKR - 年中回顾

    自从订阅了吴军老师的<硅谷来信>之后,对其中一篇介绍Google的目标管理方法OKR的文章记忆犹新.想到自己喜欢在每年年初的时候给自己定制一些规划,于是乎了解了一下OKR并重构了一下我的2 ...

  3. ASP.NET Core SignalR中的流式传输

    什么是流式传输? 流式传输是这一种以稳定持续流的形式传输数据的技术. 流式传输的使用场景 有些场景中,服务器返回的数据量较大,等待时间较长,客户端不得不等待服务器返回所有数据后,再进行相应的操作.这时 ...

  4. 【朝花夕拾】Android性能篇之(二)Java内存分配

    前言        在内存方面,相比于C/C++程序员,咱们java系程序员算是比较幸运的,因为对于内存的分配和回收,都交给了JVM来处理了,而不需要手动在代码中去完成.有了虚拟机内存管理机制,也就不 ...

  5. 洛谷:P1182:数列分段`Section II`

    题目描述 对于给定的一个长度为N的正整数数列 A-iA−i ,现要将其分成 M(M≤N)M(M≤N) 段,并要求每段连续,且每段和的最大值最小. 关于最大值最小: 例如一数列 4 2 4 5 1424 ...

  6. 基于spark实现并行化Apriori算法

    详细代码我已上传到github:click me 一. 实验要求         在 Spark2.3 平台上实现 Apriori 频繁项集挖掘的并行化算法.要求程序利用 Spark 进行并行计算. ...

  7. 详解 Symbol 类型

    ES5 的对象属性名都是字符串,这容易造成属性名的冲突.比如,你使用了一个他人提供的对象,但又想为这个对象添加新的方法(mixin 模式),新方法的名字就有可能与现有方法产生冲突.如果有一种机制,保证 ...

  8. 使用MaxCompute Java SDK运行安全相关命令

    使用MaxCompute Console的同学,可能都使用过MaxCompute安全相关的命令.官方文档上有详细的MaxCompute安全指南,并给出了安全相关语句汇总.   简而言之,权限管理.列级 ...

  9. [十一]JavaIO之DataInputStream 和 DataOutputStream

    功能简介 DataInputStream和DataOutputStream 继承了各自的FilterInputStream以及FilterOutputStream 使用装饰器模式对InputStrea ...

  10. springmvc 项目完整示例03 小结

    利用spring 创建一个web项目 大致原理 利用spring的ioc 原理,例子中也就是体现在了配置文件中 设置了自动扫描注解 配置了数据库信息等 一般一个项目,主要有domain,dao,ser ...