「这是我参与2022首次更文挑战的第 18 天,活动详情查看:2022首次更文挑战」
题目链接
530. 二叉搜索树的最小绝对差 - 力扣(LeetCode) (leetcode-cn.com)
题目描述
给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值 。
差值是一个正数,其数值等于两值之差的绝对值。
测试用例
示例 1:
输入: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);
}
};
可以看的出,这种解法的执行耗时非常的优秀,但,内存方面不尽人意,可能是我哪里没怎么注意到吧