力扣【二叉树专题】👊 530. 二叉搜索树的最小绝对差

193 阅读2分钟

「这是我参与2022首次更文挑战的第 18 天,活动详情查看:2022首次更文挑战

题目链接

530. 二叉搜索树的最小绝对差 - 力扣(LeetCode) (leetcode-cn.com)

题目描述

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

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

测试用例

示例 1:

image.png

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

条件限制

树中节点的数目范围是 [2, 10^4]
0 <= Node.val <= 10^5

题目分析

分析题目,有几个关键点,一是提供的树为 搜索二叉树,二是题目需要我们返回任意两个点之间的 最小差值

搜索二叉树算是一种的已经排序好的二叉树,我们对他进行中序遍历时,访问到的节点的值,是升序排列的。而题目题目需要我们求任意两点的最小差值,其实就是需要我们拿到搜索二叉树中序遍历的结果,然后一一比较他临近的两个点的绝对差值,然后我们返回最小的值即可

解法1

中序遍历二叉树的时候,我们将值依次记录到数组,然后对数组的值两两,并记录下最小的差值

优点是操作简单容易实现,但缺点也很明显,一是需要额外的空间来了记录树的节点的值,二是需额外再遍历一次数组,时间复杂度提高了

解法2

同样是对树进行中序遍历,但仅仅引入一个额外的变量记录在遍历的时候上一次的值,两两相减就得到最小差值,然后修改变量的值为当前节点的值,供下一次遍历使用

由于遍历初始化的时候,是没有上一个节点的值,因此直接初始化为 Number.MAX_VALUE 即可

本次使用的就是第二种解法

代码实现

var getMinimumDifference = function(root) {
    let min = Number.MAX_VALUE,
        lastVal = min;
    trave(root);
    return min;

    function trave(node) {
        if (node == null) return;
        trave(node.left);
        min = Math.min(Math.abs(node.val - lastVal), min);
        lastVal = node.val;
        trave(node.right);
    }
};

image.png

可以看的出,这种解法的执行耗时非常的优秀,但,内存方面不尽人意,可能是我哪里没怎么注意到吧