代码随想录算法训练营第二十一天 | 530.二叉搜索树的最小绝对差

60 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第19天,点击查看活动详情

前言

二叉树的题目终于过半了,上次刷题就在二叉树中断掉,这次一定要坚持下去完成一刷!

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

题目分析

题目给出一二叉搜索树,要求返回数中,任意两个不同节点值之间的最小差值(两值之差的绝对值)

这种题我们要注意,二叉搜索树是有序的,可以将它想象为一个有序数组。这样在二差搜索树上求最值或者差值之类的问题就很容易解决了。

解题

第一种解法

根据二叉搜索树的特性,我们利用中序遍历,将二叉搜索数转换为一个有序数组。接着在有序数组中求出差值的最小值就非常容易了。

代码如下:

var getMinimumDifference = function(root) {
    let arr = []
    const buildArr = (root) => {
        if(root) {
            buildArr(root.left)
            arr.push(root.val)
            buildArr(root.right)
        }
    }
    buildArr(root)
    let min = arr[arr.length - 1]
    for(let i = 1;i < arr.length;i++) {
        if(min > arr[i] - arr[i - 1]) min = arr[i] - arr[i - 1]
    } 
    return min 
};

第二种解法

在二叉搜索树中序遍历的过程中,我们可以直接计算差值的最小值。如果想要在过程中计算差值,只需要记录前一个节点。

通过定义一个指针指向前一个节点,再在遍历的过程中比较即可。

代码如下:

var getMinimumDifference = function(root) {
    let res = Infinity,preNode = null
    const inorder = (node) => {
        if(!node) return
        inorder(node.left)
        if(preNode) res = Math.min(res, node.val - preNode.val)   
        preNode = node
        inorder(node.right)
    }
    inorder(root)
    return res
}

上面的代码中定义res,用于存放较小的差值。定义preNode用于存放前一个节点的值。通过中序遍历,在中间判断差值更小的值,更新res。并将当前节点赋值给preNode。最后可以得出二叉搜索树最小的差值。