力扣 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]
  
  
 提示:  
 - 二叉树的节点总数为?
n 1 <= k <= n <= 10^40 <= Node.val <= 10^9-109?<= target <= 10^9 
  
 来源:力扣(LeetCode)  链接:https://leetcode.cn/problems/closest-binary-search-tree-value-ii  著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。?  
  
做题结果 
通过,就纯粹的树的递归  
方法1-1:归并型的递归 
因为两个都是递归就分一下小点  
归并型的意思就是直接从子结果推到父,合并父子合并的结果  
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);
        }
    }  
?方法1-2:滑窗型的递归 
保持窗口内有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);
            } 
            
        }
    }  
                
        
        
        
    
  
 
 |