壹 ❀ 引

本题来自LeetCode 783. 二叉搜索树节点最小距离,题目描述如下:

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

示例 1:

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

示例 2:

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

提示:

树中节点数目在范围 [2, 100] 内

0 <= Node.val <= 105

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

贰 ❀ 题解分析

也许当你看到此题,你会想着题目要求任意两个不同节点中找到最小差,应该怎么遍历才好呢。我们假定给你一个有序的数组[1,3,4,6],如果让你求最小差会怎么做?你一定会每次拿两个相邻的数进行求差,然后右移,一直找到最小的差集。

为什么是相邻的两个数?因为数组既然有序了,不找相邻难道求两个相隔N个数的差吗?比如上面的数组3-1的差一定比4-1的小。

所以暴力的做法,我们可以用递归的方式将二叉树转为数组,排序后依次遍历,并找出最小的差。虽然这样做可以,但其实没必要。

让我们再回头看一眼例子中的二叉树,你会发现每个左子树的节点,一定比父节点小,然后父节点又比右子树的节点小。

比如图1中,1<2<3,而3有可以看成是4的左子树,且2<4<5,哎?如果我们按照这个顺序去遍历,就不用生成数组还做排序了,因为这个过程就是有序的,那么这个查找过程其实就是中序遍历了。我在JS 前序遍历、中序遍历、后序遍历、层序遍历详解,深度优先与广度优先区别,附leetcode例题题解答案一文中介绍了前序遍历,中序遍历以及后续遍历的基本模板与遍历过程,有兴趣的同学可以看看。

那么我们直接贴上中序遍历的模板:

var inorderTraversal = function(root) {
// 遍历函数
function traversal(root) {
if (root !== null) {
if (root.left) {
// 递归遍历左子树
traversal(root.left);
};
// 访问根节点的值
console.log(root.val)
if (root.right) {
// 递归遍历右子树
traversal(root.right);
};
};
};
traversal(root);
};

因为中序遍历满足左节点------>根节点------>右节点的顺序,所以如果一个根节点有左节点,那就先访问左节点,而左节点可能还有自己的左节点,所以递归一直往下找,直到找不到了,这个时候我们就可以处理我们想要的逻辑了,比如打印出此时节点的值。

我们知道,函数调用栈是先进后出,当左节点的函数执行完成被释放,那自然下一个执行的就是自己的根节点的函数了,根节点函数执行完被释放,自然又会执行右节点的函数....一直执行,知道整个二叉树的节点被访问完毕。

那么我们就可以利用中序遍历的特点,在访问每个节点的时候,求跟上一个节点的差值,并存起来,然后依次比较,注意,我们要存2个东西,一个是上一个节点的值,这个值在递归时是不断被更新的,第二个是最小值,如果遇到更小就更新它即可。

综合上面的想法,让我们来实现它:

/**
* Definition for a binary tree node.
* function TreeNode(val) {
* this.val = val;
* this.left = this.right = null;
* }
*/
/**
* @param {TreeNode} root
* @return {number}
*/
var getMinimumDifference = function (root) {
function findMin(node) {
if (node === null) {
return;
};
if (node.left) {
findMin(node.left);
};
// 这里是为了避免第一个节点参与比较
if (pre !== null) {
// abs用于消除差为负数的情况,直接比较绝对值
min = Math.min(min, Math.abs(node.val - pre));
};
pre = node.val;
if (node.right) {
findMin(node.right);
};
};
// 第一个节点因为找不到更前面的节点了,所以故意设置个null用于消除第一次比较
let pre = null, min = Infinity;
findMin(root);
return min;
};

唯一需要注意的是是初始pre是null,目的是第一个左节点找不到其它节点进行求差,准确来说应该是从第二个节点开始才能求出差,所以设为null就是这个目的,其它就没什么难度了,那么本文结束。

JS Leetcode 530. 二叉搜索树的最小绝对差 题解分析,再次了解中序遍历的更多相关文章

  1. [LeetCode]230. 二叉搜索树中第K小的元素(BST)(中序遍历)、530. 二叉搜索树的最小绝对差(BST)(中序遍历)

    题目230. 二叉搜索树中第K小的元素 给定一个二叉搜索树,编写一个函数 kthSmallest 来查找其中第 k 个最小的元素. 题解 中序遍历BST,得到有序序列,返回有序序列的k-1号元素. 代 ...

  2. 代码随想录算法训练营day21 | leetcode ● 530.二叉搜索树的最小绝对差 ● 501.二叉搜索树中的众数 ● ***236. 二叉树的最近公共祖先

    LeetCode 530.二叉搜索树的最小绝对差 分析1.0 二叉搜索树,中序遍历形成一个升序数组,节点差最小值一定在中序遍历两个相邻节点产生 ✡✡✡ 即 双指针思想在树遍历中的应用 class So ...

  3. Java实现 LeetCode 530 二叉搜索树的最小绝对差(遍历树)

    530. 二叉搜索树的最小绝对差 给你一棵所有节点为非负值的二叉搜索树,请你计算树中任意两节点的差的绝对值的最小值. 示例: 输入: 1 \ 3 / 2 输出: 1 解释: 最小绝对差为 1,其中 2 ...

  4. Leetcode:530. 二叉搜索树的最小绝对差

    Leetcode:530. 二叉搜索树的最小绝对差 Leetcode:530. 二叉搜索树的最小绝对差 Talk is cheap . Show me the code . /** * Definit ...

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

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

  6. 530 Minimum Absolute Difference in BST 二叉搜索树的最小绝对差

    给定一个所有节点为非负值的二叉搜索树,求树中任意两节点的差的绝对值的最小值.示例 :输入:   1    \     3    /   2输出:1解释:最小绝对差为1,其中 2 和 1 的差的绝对值为 ...

  7. [LC]530题 二叉搜索树的最小绝对差

    ①题目 给定一个所有节点为非负值的二叉搜索树,求树中任意两节点的差的绝对值的最小值. 示例 : 输入: 1   \   3  / 2 输出:1 解释:最小绝对差为1,其中 2 和 1 的差的绝对值为 ...

  8. [Swift]LeetCode530. 二叉搜索树的最小绝对差 | Minimum Absolute Difference in BST

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

  9. LeetCode530. 二叉搜索树的最小绝对差

    题目 又是常见的BST,要利用BST的性质,即中序遍历是有序递增序列. 法一.中序遍历 1 class Solution { 2 public: 3 vector<int>res; 4 v ...

  10. [LeetCode] Lowest Common Ancestor of a Binary Search Tree 二叉搜索树的最小共同父节点

    Given a binary search tree (BST), find the lowest common ancestor (LCA) of two given nodes in the BS ...

随机推荐

  1. Go socket 编程源码解析(上)

    0. socket 介绍 Liunx 中一切皆文件.通过文件描述符和系统调用号可以实现对任何设备的访问.同样的,socket 也是一种文件描述符.通过 socket 可以建立网络传输.对于 TCP 和 ...

  2. Linux系列之文件和目录权限

    前言 我们知道,root用户基本上可以在系统中做任何事.其他用户有更多的限制,并且通常被收集到组中.你把有类似需求的用户放入一个被授予相关权限的组,每个成员都继承组的权限. 让我们看一下: 查看权限( ...

  3. ORA-00947:Not enough values (没有足够的值)

    1.问题 2.解决方式 大概率是关系表实际列数大于你所填的元素个数,请检查是否有疏漏的列即可. 我这里是以为代理键直接忽略不写即可,没有标明具体插入列,但是还是得标明才行 --创建图书目录表TITLE ...

  4. 百度网盘(百度云)SVIP超级会员共享账号每日更新(2024.01.21)

    一.百度网盘SVIP超级会员共享账号 可能很多人不懂这个共享账号是什么意思,小编在这里给大家做一下解答. 我们多知道百度网盘很大的用处就是类似U盘,不同的人把文件上传到百度网盘,别人可以直接下载,避免 ...

  5. [转帖]【sql server安全】sql server连接加密,sql server SSL加密连接

    https://www.cnblogs.com/gered/p/13595098.html#_label1_0 MSSQL - 最佳实践 - 使用SSL加密连接 回到顶部 author: 风移 回到顶 ...

  6. [转帖]六千字带你了解 Oracle 统计信息和执行计划

    https://cloud.tencent.com/developer/article/1616706 大家好,我是 JiekuXu,很高兴又和大家见面了,今天分享下 Oracle 统计信息和执行计划 ...

  7. [转帖]使用 TiFlash

    TiDB试用 来源:TiDB  浏览 490 扫码 分享 2021-04-20 20:57:48 使用 TiFlash 按表构建 TiFlash 副本 查看表同步进度 使用 TiDB 读取 TiFla ...

  8. [转帖]Linux 内核 | 网络流量限速方案大 PK

    https://maimai.cn/article/detail?fid=1674483493&efid=UXVPILU_JTlqLrYhTkDStA 网络流量限速是一个经久不衰的话题,Lin ...

  9. CentOS8 安装Oracle19c RPM的办法

    1. 下载相应的rpm包 我这边使用的主要有: -rw-r--r-- 1 root root 19112 Apr 5 15:13 compat-libcap1-1.10-7.el7.x86_64.rp ...

  10. PG数据库异步流复制

    PG数据库异步流复制 背景说明 最近想进行一个数据库高可用课题的研究. 因为之前某种原因,这次选择的是PG数据库. 为了简单起见, 暂时采用PG异步流复制的场景. 这次仅是为了测试, 不考虑高可用绿色 ...