持续创作,加速成长!这是我参与「掘金日新计划 · 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。最后可以得出二叉搜索树最小的差值。