• 力扣 272. 最接近的二叉搜索树值 II 递归


    力扣 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^4
    • 0 <= 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个,超出的部分,通过删除左右两侧较远的节点实现

    1. class Solution {
    2. public List<Integer> closestKValues(TreeNode root, double target, int k) {
    3. Deque<Integer> ans = new LinkedList<>();
    4. if(root == null) return new ArrayList<>();
    5. List<Integer> left = closestKValues(root.left,target,k);
    6. List<Integer> right = closestKValues(root.right,target,k);
    7. ans.addAll(left);
    8. ans.add(root.val);
    9. ans.addAll(right);
    10. if(ans.size()<=k){
    11. return new ArrayList<>(ans);
    12. }
    13. while (ans.size()>k){
    14. double d1 = Math.abs(ans.getFirst()-target);
    15. double d2 = Math.abs(ans.getLast()-target);
    16. if(d1>d2){
    17. ans.removeFirst();
    18. }else{
    19. ans.removeLast();
    20. }
    21. }
    22. return new ArrayList<>(ans);
    23. }
    24. }

     方法1-2:滑窗型的递归

    保持窗口内有k个可行解

    1. 二叉搜索树中序相当于顺序遍历有序数组

    2. 前面k个直接取

    3. 如果超过k个,检查更大值是不是更接近,不是就直接退出,是就移除第一个加一个当前值

    1. class Solution {
    2. List<Integer> result = new LinkedList<>();
    3. public List<Integer> closestKValues(TreeNode root, double target, int k) {
    4. dfs(root,target,k);
    5. return result;
    6. }
    7. public void dfs(TreeNode root, double target, int k) {
    8. if (root == null) return ;
    9. dfs(root.left,target,k);
    10. if (result.size() < k || Math.abs(result.get(0) - target) > Math.abs(root.val - target)) {
    11. if(result.size()==k) result.remove(0);
    12. result.add(root.val);
    13. dfs(root.right,target,k);
    14. }
    15. }
    16. }

  • 相关阅读:
    操作系统 day08(进程通信)
    白杨SEO:SEO转型系列之十一,传统SEO从业人员如何转行社群运营/营销?
    Java实现快速排序以及原理
    vue3+vite
    HTTP 之 options预请求 nginx 解决跨域 postman调试跨域问题
    基于ElasticSearch+Vue实现简易搜索
    day03_顺丰快递分拣小程序
    多种方法论的融合,可以把FMEA做得更好——FMEA软件
    猎聘爬虫(附源码)
    pthread_cancel手册翻译
  • 原文地址:https://blog.csdn.net/yu_duan_hun/article/details/125452172