「力扣270」 最接近的二叉搜索树值

343 阅读1分钟

题目链接

最接近的二叉搜索树值

思路

二叉搜索树的性质是,对于任意一棵子树,子树根结点的数值,一定比它左子树的所有结点数值要大,一定比它右子树的所有结点数值要小。

利用这个性质,从树的根结点开始滑:

  1. 如果 target < node.value 则向左滑(右子树的结点只会更大,排除右子树),否则向右滑(排除左子树),每次滑动都能排除一批不可能成为结果的结点
  2. 每次到达一个结点,都计算一下此时结点数值和target的距离,全局维护这个值,只存储最小的值dis (寓意最接近的距离)。当滑动到叶子结点后,最小的dis对应的结点数值,即是最接近目标值 target 的数值。

复杂度

假设二叉搜索树的结点数量为 N

时间复杂度

整个流程只遍历了一个二叉树的高度,所以是 O(logN)

额外空间复杂度

只用了有限几个变量,所以额外空间复杂度是O(1)

代码

TypeScript

interface Answer {
    val: number;  // 结点数值
    min: number;  // 该结点和 target 的相差的绝对值
}

function closestValue(root: TreeNode | null, target: number): number {
    const answer: Answer = { val: null, min: Number.MAX_SAFE_INTEGER };
    let cur = root;

    while (cur) {
        const dis = Math.abs(cur.val - target);
        if (dis < answer.min) {
            answer.val = cur.val;
            answer.min = dis;
        }
        if (target < cur.val) {
            cur = cur.left;
        } else {
            cur = cur.right;
        }
    }

    return answer.val;
}