题目链接
思路
二叉搜索树的性质是,对于任意一棵子树,子树根结点的数值,一定比它左子树的所有结点数值要大,一定比它右子树的所有结点数值要小。
利用这个性质,从树的根结点开始滑:
- 如果
target < node.value则向左滑(右子树的结点只会更大,排除右子树),否则向右滑(排除左子树),每次滑动都能排除一批不可能成为结果的结点。 - 每次到达一个结点,都计算一下此时
结点数值和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;
}