二叉搜索树的最小绝对差
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
节点的前一个节点。

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
};
因为递归的时候涉及到一些公共的变量,所以将递归函数放在整个函数里面作为嵌套
不能将公共的变量放在全局作用域中!!每一次进行一次样例测试,会调用一次函数,会改变变量的值!!