二叉搜索树的最小绝对差
给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值 。
差值是一个正数,其数值等于两值之差的绝对值。
示例 1:


codeType
输入:root = [4,2,6,1,3]
输出:1
示例 2:
codeType
输入:root = [1,0,48,null,null,12,49]
输出:1
提示:
- 树中节点的数目范围是 [2, 104]
- 0 <= Node.val <= 105
解法
ts
/**
* Definition for a binary tree node.
* class TreeNode {
* val: number
* left: TreeNode | null
* right: TreeNode | null
* constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
* }
*/
function getMinimumDifference(root: TreeNode | null): number {
// 按照二叉排序树的规则,左子树的节点<根节点<右子树节点
// 二叉排序树按中序遍历,就可以得到从小到大排序的序列。
// 所以按照中序遍历,依次得到两个节点之间的差值,就可以找到最小差值。
// 节点中所有数字都是 >= 0的
// 第一个遍历的节点是最左下节点,其值最小,没有前驱
// 用-1来跳过计算
let res = Infinity
let pre = -1
function inOrder(root: TreeNode | null){
if(!root) return
inOrder(root.left)
if(pre === -1){ // 访问的第一个节点,跳过计算
pre = root.val
}else{
res = Math.min(res, root.val - pre) // 都大于0且当前节点值一定大于前驱,所以不需要绝对值
pre = root.val // 更新前驱为当前访问节点
}
inOrder(root.right)
}
inOrder(root)
return res
};