壹 ❀ 引

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

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

示例 1:

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

示例 2:

  1. 输入:root = [1,0,48,null,null,12,49]
  2. 输出: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例题题解答案一文中介绍了前序遍历,中序遍历以及后续遍历的基本模板与遍历过程,有兴趣的同学可以看看。

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

  1. var inorderTraversal = function(root) {
  2. // 遍历函数
  3. function traversal(root) {
  4. if (root !== null) {
  5. if (root.left) {
  6. // 递归遍历左子树
  7. traversal(root.left);
  8. };
  9. // 访问根节点的值
  10. console.log(root.val)
  11. if (root.right) {
  12. // 递归遍历右子树
  13. traversal(root.right);
  14. };
  15. };
  16. };
  17. traversal(root);
  18. };

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

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

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

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

  1. /**
  2. * Definition for a binary tree node.
  3. * function TreeNode(val) {
  4. * this.val = val;
  5. * this.left = this.right = null;
  6. * }
  7. */
  8. /**
  9. * @param {TreeNode} root
  10. * @return {number}
  11. */
  12. var getMinimumDifference = function (root) {
  13. function findMin(node) {
  14. if (node === null) {
  15. return;
  16. };
  17. if (node.left) {
  18. findMin(node.left);
  19. };
  20. // 这里是为了避免第一个节点参与比较
  21. if (pre !== null) {
  22. // abs用于消除差为负数的情况,直接比较绝对值
  23. min = Math.min(min, Math.abs(node.val - pre));
  24. };
  25. pre = node.val;
  26. if (node.right) {
  27. findMin(node.right);
  28. };
  29. };
  30. // 第一个节点因为找不到更前面的节点了,所以故意设置个null用于消除第一次比较
  31. let pre = null, min = Infinity;
  32. findMin(root);
  33. return min;
  34. };

唯一需要注意的是是初始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. java - 字符串转数字

    Integer.valueOf("str").intValue(): Integer.valueOf("123").intValue():

  2. 【Tomcat 组成与工作原理】

    Tomcat组成与工作原理 Tomcat 是什么 开源的 Java Web 应用服务器,实现了 Java EE(Java Platform Enterprise Edition)的部 分技术规范,比如 ...

  3. [转帖]【linux命令学习】— sar 命令学习

    https://blog.csdn.net/u013332124/article/details/101075521 一.命令使用介绍 sar命令全称 System Activity Report,它 ...

  4. parquet极简学习

    parquet极简学习 摘要 parquet的概念: Parquet文件是一种列式存储文件格式,广泛应用于大数据处理框架, 如Apache Hadoop和Apache Spark. 它通过将数据组织成 ...

  5. [转帖]PostgreSQL 压测工具pgbench

    1.命令 pgbench --help pgbench is a benchmarking tool for PostgreSQL. Usage:   pgbench [OPTION]... [DBN ...

  6. 【转帖】用pycharm开发django项目示例

    https://www.cnblogs.com/kylinlin/p/5184592.html pycharm开发django工程(一) 在pycharm(企业版)中新建Django工程,注意使用虚拟 ...

  7. [转帖]OutOfMemoryError内存溢出相关的JVM参数

    原文在这里: OutOfMemoryError内存溢出相关的JVM参数 JVM提供了很多处理内存溢出的相关参数,本文主要来讲解下这些参数,当你遇到内存溢出的时候可能会对你非常有帮助,这些参数主要有: ...

  8. 银河麒麟系统信息获取V1.0版本

    银河麒麟系统信息获取 摘要 最近项目有一些兼容性测试需求. 可能需要获取一些系统配置信息便于相关的工作. 想着自己总结一下. 便于后续的不太熟悉的同事进行简要处理 银河麒麟获取版本 nkvers # ...

  9. Ant Design Vue 中Drawer自定头部的样式、内容部分的样式、弹出层的样式

    <a-drawer :title="myTitle" placement="right" :visible="visible" @cl ...

  10. Unity SetActive Event

    网上查了一下Unity的SetActive变化事件没有找到,我想到用另一种思路来实现这个事件通知,它可用来调试是何处把某个gameobject隐藏掉了 Unity提供了这两个函数,OnEnable,O ...