这是悦乐书的第314次更新,第335篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第183题(顺位题号是783)。给定具有根节点值的二叉搜索树(BST),返回树中任何两个不同节点的值之间的最小差值。示例:

给定的树[4,2,6,1,3,null,null]由下图表示:

      4
/ \
2 6
/ \
1 3

输出:1

说明:请注意,root是TreeNode对象,而不是数组。该树中的任意节点最小差值为1,它发生在节点1和节点2之间,也发生在节点3和节点2之间。



注意

  • BST的大小将在2到100之间。

  • BST始终有效,每个节点的值都是整数,每个节点的值都不同。

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

02 第一种解法

题目给的树是二叉树,并且是一个二叉搜索树,而其遵循左子树<根节点<右子树的大小关系,借助中序遍历,我们可以得到一组有序的节点值,从小到大排列。

使用一个数组,将中序遍历的节点值依次添加进数组中去,然后遍历数组,比较前后两个节点之间的差值,最后得到最小差值并返回。中间遍历BST节点使用递归完成。

/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution { private List<Integer> list = new ArrayList<Integer>(); public int minDiffInBST(TreeNode root) {
helper(root);
int min = Integer.MAX_VALUE;
for (int i=1; i<list.size(); i++) {
int dif = Math.abs(list.get(i) - list.get(i-1));
min = Math.min(dif, min);
}
return min;
} public void helper(TreeNode root){
if (root == null) {
return ;
}
helper(root.left);
list.add(root.val);
helper(root.right);
} }

03 第二种解法

针对第一种思路,我们也可以使用迭代的方法来解。使用栈来对BST进行遍历,依旧使用中序遍历,先找到BST中左子树里面的最底层左节点,然后再处理右节点。遍历完节点且将节点值添加进数组中后,对数组中的相邻元素求差值,依次比较得到最小差值返回即可。

/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution { public int minDiffInBST(TreeNode root) {
List<Integer> list = new ArrayList<Integer>();
Stack<TreeNode> stack = new Stack<TreeNode>();
while (!stack.isEmpty() || root != null) {
while (root != null) {
stack.push(root);
root = root.left;
}
if (!stack.isEmpty()) {
root = stack.pop();
list.add(root.val);
root = root.right;
}
}
int min = Integer.MAX_VALUE;
for (int i=1; i<list.size(); i++) {
int dif = Math.abs(list.get(i) - list.get(i-1));
min = Math.min(dif, min);
}
return min;
}
}

04 第三种解法

我们也可以不使用数组,使用一个变量来存储当前节点的前一个节点值即可,在处理当前节点时就可以直接计算两节点的差值,依旧使用中序遍历,此解法使用递归。

/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution { private Integer prev = null;
private int min = Integer.MAX_VALUE; public int minDiffInBST(TreeNode root) {
helper(root);
return min;
} public void helper (TreeNode root) {
if (root == null) {
return ;
}
helper(root.left);
if (prev != null) {
min = Math.min(min, root.val-prev);
}
prev = root.val;
helper(root.right);
}
}

05 第四种解法

针对第三种解法,同样可以使用迭代的方式,依旧使用栈,和第二种解法里用栈的方式一样。

/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution { public int minDiffInBST(TreeNode root) {
Integer prev = null;
int min = Integer.MAX_VALUE;
Stack<TreeNode> stack = new Stack<TreeNode>();
while (!stack.isEmpty() || root != null) {
while (root != null) {
stack.push(root);
root = root.left;
}
if (!stack.isEmpty()) {
root = stack.pop();
if (prev != null) {
min = Math.min(min, root.val - prev);
}
prev = root.val;
root = root.right;
}
}
return min;
}
}

06 小结

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

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

LeetCode算法题-Minimum Distance Between BST Nodes(Java实现-四种解法)的更多相关文章

  1. LeetCode算法题-Intersection of Two Arrays(Java实现-四种解法)

    这是悦乐书的第207次更新,第219篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第75题(顺位题号是349).给定两个数组,编写一个函数来计算它们的交集.例如: 输入: ...

  2. 【LeetCode】783. Minimum Distance Between BST Nodes 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 中序遍历 日期 题目地址:https://leetc ...

  3. LeetCode 783. 二叉搜索树结点最小距离(Minimum Distance Between BST Nodes)

    783. 二叉搜索树结点最小距离 LeetCode783. Minimum Distance Between BST Nodes 题目描述 给定一个二叉搜索树的根结点 root, 返回树中任意两节点的 ...

  4. 【Leetcode_easy】783. Minimum Distance Between BST Nodes

    problem 783. Minimum Distance Between BST Nodes 参考 1. Leetcode_easy_783. Minimum Distance Between BS ...

  5. LeetCode算法题-Minimum Absolute Difference in BST(Java实现)

    这是悦乐书的第253次更新,第266篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第120题(顺位题号是530).给定具有非负值的二叉搜索树,找到任意两个节点的值之间的最 ...

  6. LeetCode算法题-Minimum Index Sum of Two Lists(Java实现)

    这是悦乐书的第272次更新,第286篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第139题(顺位题号是599).假设Andy和Doris想要选择一家餐馆吃晚餐,他们都有 ...

  7. LeetCode算法题-Hamming Distance(Java实现)

    这是悦乐书的第237次更新,第250篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第104题(顺位题号是461).两个整数之间的汉明距离是相应位不同的位置数.给定两个整数 ...

  8. LeetCode算法题-Minimum Moves to Equal Array Elements(Java实现)

    这是悦乐书的第233次更新,第246篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第100题(顺位题号是453).给定大小为n的非空整数数组,找到使所有数组元素相等所需的 ...

  9. LeetCode算法题-Minimum Depth of Binary Tree(Java实现)

    这是悦乐书的第168次更新,第170篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第27题(顺位题号是111).给定二叉树,找到它的最小深度.最小深度是沿从根节点到最近的 ...

随机推荐

  1. C++的反思[转]

    最近两年 C++又有很多人出来追捧,并且追捧者充满了各种优越感,似乎不写 C++你就一辈子是低端程序员了,面对这种现象,要不要出来适时的黑一下 C++呢?呵呵呵. 咱们要有点娱乐精神,关于 C++的笑 ...

  2. Linux用户和组管理,添加修改用户,添加修改组,加入组,移除组

    1.安全介绍3A Authentication: 认证,用户名和对应口令 Authorization: 授权,不同用户权限不同 Accouting/Audition: 审计 2. 所属者和所属组 us ...

  3. persistent_storage_worker.go

    package) ) :length],) ) :length]) } func (engine *Engine) persistentStorageInitWorker(shard int) {   ...

  4. search_request.go

    package types type SearchRequest struct {     // 搜索的短语(必须是UTF-8格式),会被分词     // 当值为空字符串时关键词会从下面的Token ...

  5. engine_init_options.go

    package ) type {         options.PersistentStorageShards = defaultPersistentStorageShards     } }

  6. go源文件中是否有main函数

    import (    "go/parser" "go/token"    "go/ast"  )  func HasMain(file s ...

  7. BZOJ_4819_[Sdoi2017]新生舞会_01分数规划+费用流

    BZOJ_4819_[Sdoi2017]新生舞会_01分数规划+费用流 Description 学校组织了一次新生舞会,Cathy作为经验丰富的老学姐,负责为同学们安排舞伴.有n个男生和n个女生参加舞 ...

  8. Python 魔术方法笔记

    魔术方法总是被__包围, 如__init__ , __len__都是常见的魔术方法,这里主要写一下我遇到的一些魔术方法 setitem 对某个索引值赋值时 即可以进行赋值操作,如 def __seti ...

  9. Postman----presets与环境变量的联合使用

    一.环境 在开发不同阶段,可能存在不同的环境(对我碰到的就是服务器地址/api版本/header信息等不一样),比如 debug环境和release环境,每次切换环境测试的时候都得重新配置url信息, ...

  10. JDBC知识详解

    一.相关概念 1.什么是JDBC JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它 ...