力扣.270. 最接近的二叉搜索树值(中序遍历思想)

文章目录

题目描述

思路

遍历思想(利用二叉树的中序遍历)

本题的难点在于可能存在多个答案,并且要返回最小的那一个 ,为了解决这个问题,我门则要利用上二叉搜索树中序遍历为有序序列 的特性,具体到代码中(结合代码看):

1.我们用变量res记录最终的结果,同时在中序遍历位置处利用Math.abs(root.val - target) < Math.abs(res - target)边遍历边更新res的值(注意此处是小于号
2.根据 target 和 root.val 的相对大小决定去左右子树搜索:如果 target 比 root 大,那么 root 的左子树差值肯定更大,直接遍历右子树;如果 target 比 root 小,那么 root 的右子树差值肯定更大,直接遍历左子树
3.同时要注意深刻体会
二叉树的中序遍历
(即是在二叉树中遍历完当前根节点的左子树后再准备遍历右子树的时刻)

复杂度

时间复杂度:

O ( n ) O(n) O(n);其中 n n n为二叉树的节点个数

空间复杂度:

O ( h ) O(h) O(h);其中 h h h为二叉树的高度

Code

java 复制代码
class Solution {
    int res = Integer.MAX_VALUE;

    public int closestValue(TreeNode root, double target) {
        traverse(root, target);
        return res;
    }

    // Write the if judgment logic in the middle order
    // so that it can be executed from small to large,
    // ensuring that the final result is the smallest value
    private void traverse(TreeNode root, double target) {
        if (root == null) {
            return;
        }
        // Depending on the relative size of target and root.val,
        // search the left and right subtrees
        if (root.val < target) {
            // Mid-order position 
            if (Math.abs(root.val - target) < Math.abs(res - target)) {
                res = root.val;
            }

            // If target is larger than root,
            // then root's left subtree difference must be larger,
            // and the right subtree is traversed directly
            traverse(root.right, target);
        } else {
            // If target is smaller than root,
            // then root's right subtree difference must be larger,
            // and the left subtree is traversed directly
            traverse(root.left, target);
            
            // Mid-order position 
            if (Math.abs(root.val - target) < Math.abs(res - target)) {
                res = root.val;
            }
        }
    }
}
相关推荐
程序员小郭83几秒前
Spring Ai 05 ChatClient Advisor 实战(日志、提示词增强、内容安全)
java·开发语言·前端
hutengyi几秒前
Spring Boot 实战篇(四):实现用户登录与注册功能
java·spring boot·后端
juleskk3 分钟前
3.22 复试训练
算法
还不秃顶的计科生5 分钟前
力扣第84题:完全平方数
算法·leetcode·职场和发展
u0133945276 分钟前
How to Run sample.war in a Tomcat Docker Container
java·docker·tomcat
2301_776508728 分钟前
分布式系统监控工具
开发语言·c++·算法
splage9 分钟前
Spring Framework 中文官方文档
java·后端·spring
暮冬-  Gentle°10 分钟前
C++与区块链智能合约
开发语言·c++·算法
愣头不青12 分钟前
78.子集
数据结构·算法
Oueii12 分钟前
C++中的代理模式实现
开发语言·c++·算法