Leetcode会员尊享100题:270.最接近的二叉树值

给你二叉搜索树的根节点 root 和一个目标值 target ,请在该二叉搜索树中找到最接近目标值 target 的数值。如果有多个答案,返回最小的那个。

示例 1:

复制代码
输入:root = [4,2,5,1,3], target = 3.714286
输出:4

示例 2:

复制代码
输入:root = [1], target = 4.428571
输出:1

提示:

  • 树中节点的数目在范围 [1, 104]
  • 0 <= Node.val <= 109
  • -109 <= target <= 109

直接上代码:

java 复制代码
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public int closestValue(TreeNode root, double target) {
        Info info = getInfo(root, target);
        return info.value;
    }

    public Info getInfo(TreeNode root, double target) {
        if(root == null) {
            return new Info(Integer.MAX_VALUE, Integer.MAX_VALUE);
        }
        if(root.left == null && root.right == null) {
            return new Info(root.val, Math.abs(root.val - target));
        }
        /**拿到左右子树的信息 */
        Info leftInfo = getInfo(root.left, target);
        Info rightInfo = getInfo(root.right, target);
        /**当前的最小差是左右树的最小差以及跟节点和target的差的最小值 */
        double distance = Math.min(Math.abs(root.val - target), Math.min(leftInfo.distance, rightInfo.distance));
        int value = distance == leftInfo.distance? leftInfo.value : distance == rightInfo.distance? rightInfo.value : root.val;
        /**有可能有重复的值,需要判断取最小那个 */
        if(distance == leftInfo.distance) {
            value = Math.min(value, leftInfo.value);
        }
        if(distance == rightInfo.distance) {
            value = Math.min(value, rightInfo.value);
        }
        if(distance == Math.abs(root.val - target)) {
            value = Math.min(value, root.val);
        }
        /**返回当前树的信息 */
        return new Info(value, distance);
    }
}

class Info {
    int value;
    double distance;
    public Info(int value, double distance) {
        this.value = value;
        this.distance = distance;
    }
}

看不懂的请私信或者留言,二叉树的所有问题,我倾向于使用二叉树的递归套路,这个题其实可以用DFS,我懒得用

相关推荐
心中有国也有家10 小时前
cann-recipes-infer:昇腾 NPU 推理的“菜谱集合”
经验分享·笔记·学习·算法
绝知此事10 小时前
【算法突围 01】线性结构与哈希表:后端开发的收纳术
java·数据结构·算法·面试·jdk·散列表
碧海银沙音频科技研究院10 小时前
通话AEC与语音识别AEC的软硬回采链路
深度学习·算法·语音识别
csdn_aspnet11 小时前
Python 算法快闪 LeetCode 编号 70 - 爬楼梯
python·算法·leetcode·职场和发展
LuminousCPP11 小时前
数据结构 - 线性表第四篇:C 语言通讯录优化升级全记录(踩坑 + 思考)
c语言·开发语言·数据结构·经验分享·笔记·学习
AI算法沐枫12 小时前
深度学习python代码处理科研测序数据
数据结构·人工智能·python·深度学习·决策树·机器学习·线性回归
m0_6294947314 小时前
LeetCode 热题 100-----26.环形链表 II
数据结构·算法·leetcode·链表
壹号用户14 小时前
用队列实现栈
数据结构·算法
做人求其滴14 小时前
面试经典 150 题 380 274
c++·算法·面试·职场和发展·力扣