最接近的二叉搜索树值 II
难度:
标签:
题目描述
代码结果
运行时间: 22 ms, 内存: 18.1 MB
/*
* 思路:
* 1. 使用中序遍历将二叉搜索树的节点值按升序存入一个列表。
* 2. 使用Java Stream API对列表进行排序并找到距离目标值最近的k个值。
*/
import java.util.*;
import java.util.stream.Collectors;
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
public class Solution {
public List<Integer> closestKValues(TreeNode root, double target, int k) {
List<Integer> sortedValues = new ArrayList<>();
inorderTraversal(root, sortedValues);
return sortedValues.stream()
.sorted((a, b) -> Double.compare(Math.abs(a - target), Math.abs(b - target)))
.limit(k)
.collect(Collectors.toList());
}
private void inorderTraversal(TreeNode root, List<Integer> sortedValues) {
if (root == null) return;
inorderTraversal(root.left, sortedValues);
sortedValues.add(root.val);
inorderTraversal(root.right, sortedValues);
}
}
解释
方法:
这个题解的思路是先通过中序遍历将二叉搜索树转换成一个有序数组,然后利用二分查找找到最接近目标值的位置。接着用双指针从该位置向两边扩展,每次选择与目标值差距更小的那个点加入答案,直至选出 k 个最接近的值。
时间复杂度:
O(n + k)
空间复杂度:
O(n + k)
代码细节讲解
🦆
为什么选择中序遍历来将二叉搜索树转换成有序数组?中序遍历与其他遍历方法(如前序或后序)相比有何优势?
▷🦆
二分查找找到的位置为何用`bisect_left`而不是`bisect_right`?这样选择对结果有什么潜在影响?
▷🦆
在双指针扩展过程中,当`left`或`right`指针越界时,程序如何保证仍然能选出足够的k个最接近的值?
▷🦆
如果目标值target非常接近某个节点值,但不完全等于任何节点值,二分查找和双指针策略在这种情况下是否还能有效工作?
▷