Leetcode 2025-02-24 题目分享
二叉搜索树最近节点查询 [Medium] 题解
有坑
二叉搜索树最近节点查询
给你一个 二叉搜索树 的根节点 root
,和一个由正整数组成、长度为 n
的数组 queries
。
请你找出一个长度为 n
的 二维 答案数组
answer
,其中 answer[i] = [mini, maxi]
:
mini
是树中小于等于queries[i]
的 最大值 。如果不存在这样的值,则使用-1
代替。maxi
是树中大于等于queries[i]
的 最小值 。如果不存在这样的值,则使用-1
代替。
返回数组 answer
。
示例 1 :
1 | 输入:root = [6,2,13,1,4,9,15,null,null,null,null,null,null,14], queries = [2,5,16] |
示例 2 :
1 | 输入:root = [4,null,9], queries = [3] |
提示:
- 树中节点的数目在范围
[2, 10^5]
内 1 <= Node.val <= 10^6
n == queries.length
1 <= n <= 10^5
1 <= queries[i] <= 10^6
思路
在搜索树中查找最大最小值问题,很容易让我们联想到使用搜索树的性质。
- 中序遍历结果是有序的
- 左子树所有节点值小于根节点值;右子树所有节点值大于根节点值
所以自然可以想到从上面两个性质出发去解决。
但第一种方法需要将树遍历一次,然后再写二分来查找。
我觉得麻烦,所以直接使用了第二种思路,得到如下代码。
具体就是按性质 2 遍历二叉搜索树:求出所有比目标值小的值中的最大值,以及比目标值大的值中的最小值。
1 | function closestNodes(root: TreeNode | null, queries: number[]): number[][] { |
看似复杂度是 O(n * log n),但这是要求搜索树是平衡条件下!。
对于一个不平衡的树,例如树退化为一条链。
我们每次遍历仍需要遍历每一个节点,是 O(n)时间。
只有在平衡的时候,每一次遍历才能节省一半的搜索数量!
正解就是用二分 🙌
1 | function closestNodes(root: TreeNode | null, queries: number[]): number[][] { |
复杂度分析
时间:O(n * log n)。
空间:O(n)。
Comments
Comment plugin failed to load
Loading comment plugin