Skip to content
On this page

二叉搜索树的最小绝对差

Question

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

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

思路1

题目中要求在二叉搜索树上任意两节点的差的绝对值的最小值。

注意是二叉搜索树,二叉搜索树可是有序的。

遇到在二叉搜索树上求什么最值啊,差值之类的,就把它想成在一个有序数组上求最值,求差值,这样就简单多了。

最直观的想法,就是把二叉搜索树转换成有序数组,然后遍历一遍数组,就统计出来最小差值了。

js
var getMinimumDifference = function(root) {
    const arr = []
    digui(root,arr)
    console.log(arr)
    let ans = arr[arr.length-1]
    for (let i = 1; i < arr.length; i++) {	//遍历数组统计最小差值
        ans = Math.min(arr[i]-arr[i-1],ans)
    }
    return ans

};

//中序遍历转换成有序数组
var digui = function(root,arr) {
   if(root===null)  return
   digui(root.left,arr)
   arr.push(root.val)
   digui(root.right,arr)
};

思路2

最小差值只有可能出现在根节点和左右节点之间,而不可能出现在左节点和右节点之间

其实在二叉搜素树中序遍历的过程中,我们就可以直接计算了。

需要用一个pre节点记录一下cur节点的前一个节点。

530.二叉搜索树的最小绝对差
js
var getMinimumDifference = function(root) {
    let min = 5+10e4
    let pre = null
    const digui = (cur) =>{     //中序遍历
        if(cur===null)  return
        digui(cur.left)
        if(pre!=null)
                min = Math.min(Math.abs(pre.val-cur.val),min)
            pre = cur
        digui(cur.right)
    }
    digui(root)
    return min
};

因为递归的时候涉及到一些公共的变量,所以将递归函数放在整个函数里面作为嵌套

不能将公共的变量放在全局作用域中!!每一次进行一次样例测试,会调用一次函数,会改变变量的值!!