力扣 272. 最接近的二叉搜索树值 II
给定二叉搜索树的根
root、一个目标值target和一个整数k,返回BST中最接近目标的k个值。你可以按 任意顺序 返回答案。题目 保证 该二叉搜索树中只会存在一种 k 个值集合最接近
target
示例 1:
输入: root = [4,2,5,1,3],目标值 = 3.714286,且 k = 2 输出: [4,3]示例 2:
输入: root = [1], target = 0.000000, k = 1 输出: [1]
提示:
- 二叉树的节点总数为
n1 <= k <= n <= 10^40 <= Node.val <= 10^9-109 <= target <= 10^9
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/closest-binary-search-tree-value-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
通过,就纯粹的树的递归
因为两个都是递归就分一下小点
归并型的意思就是直接从子结果推到父,合并父子合并的结果
1. 计算出左子树前n个,计算右子树前n个,加上中间一共2n+1个,超出的部分,通过删除左右两侧较远的节点实现
- class Solution {
- public List<Integer> closestKValues(TreeNode root, double target, int k) {
- Deque<Integer> ans = new LinkedList<>();
- if(root == null) return new ArrayList<>();
- List<Integer> left = closestKValues(root.left,target,k);
- List<Integer> right = closestKValues(root.right,target,k);
- ans.addAll(left);
- ans.add(root.val);
- ans.addAll(right);
- if(ans.size()<=k){
- return new ArrayList<>(ans);
- }
-
- while (ans.size()>k){
- double d1 = Math.abs(ans.getFirst()-target);
- double d2 = Math.abs(ans.getLast()-target);
- if(d1>d2){
- ans.removeFirst();
- }else{
- ans.removeLast();
- }
- }
- return new ArrayList<>(ans);
- }
- }
保持窗口内有k个可行解
1. 二叉搜索树中序相当于顺序遍历有序数组
2. 前面k个直接取
3. 如果超过k个,检查更大值是不是更接近,不是就直接退出,是就移除第一个加一个当前值
- class Solution {
- List<Integer> result = new LinkedList<>();
- public List<Integer> closestKValues(TreeNode root, double target, int k) {
- dfs(root,target,k);
- return result;
- }
-
- public void dfs(TreeNode root, double target, int k) {
- if (root == null) return ;
- dfs(root.left,target,k);
-
- if (result.size() < k || Math.abs(result.get(0) - target) > Math.abs(root.val - target)) {
- if(result.size()==k) result.remove(0);
- result.add(root.val);
- dfs(root.right,target,k);
- }
-
- }
- }