• [LeetCode] 270. Closest Binary Search Tree Value 最近的二叉搜索树的值


    Given a non-empty binary search tree and a target value, find the value in the BST that is closest to the target.

    Note:

    • Given target value is a floating point.
    • You are guaranteed to have only one unique value in the BST that is closest to the target.

    给一个非空二叉树和一个目标值,找到和目标值最接近的一个节点值。

    利用二分搜索树的特点(左<根<右)来快速定位,由于根节点是中间值,在遍历时,如果目标值小于节点值,则找更小的值到左子树去找,反之去右子树找。

    解法1:迭代

    解法2:递归

    Java:

    public int closestValue(TreeNode root, double target) {
        double min=Double.MAX_VALUE;
        int result = root.val;
     
        while(root!=null){
            if(target>root.val){
     
                double diff = Math.abs(root.val-target);
                if(diff<min){
                    min = Math.min(min, diff);
                    result = root.val;
                }
                root = root.right;
            }else if(target<root.val){
     
                double diff = Math.abs(root.val-target);
                if(diff<min){
                    min = Math.min(min, diff);
                    result = root.val;
                }
                root = root.left;
            }else{
                return root.val;
            }
        }
     
        return result;
    }  

    Java:

    public class Solution {
        int goal;
        double min = Double.MAX_VALUE;
     
        public int closestValue(TreeNode root, double target) {
            helper(root, target);
            return goal;
        }
     
        public void helper(TreeNode root, double target){
            if(root==null)
                return;
     
            if(Math.abs(root.val - target) < min){
                min = Math.abs(root.val-target);
                goal = root.val;
            } 
     
            if(target < root.val){
                helper(root.left, target);
            }else{
                helper(root.right, target);
            }
        }
    } 

    Java: Iteration

    /**
     * Definition for a binary tree node.
     * public class TreeNode {
     *     int val;
     *     TreeNode left;
     *     TreeNode right;
     *     TreeNode(int x) { val = x; }
     * }
     */
    public class Solution {
        public int closestValue(TreeNode root, double target) {
            if (root == null) return 0;
            int min = root.val;
            while (root != null) {
                min = (Math.abs(root.val - target) < Math.abs(min - target) ? root.val : min);
                root = (root.val < target) ? root.right : root.left;
            }
            return min;
        }
    }
    

    Java: Recursion

    /**
     * Definition for a binary tree node.
     * public class TreeNode {
     *     int val;
     *     TreeNode left;
     *     TreeNode right;
     *     TreeNode(int x) { val = x; }
     * }
     */
    public class Solution {
        public int closestValue(TreeNode root, double target) {
            TreeNode child = target < root.val ? root.left : root.right;
            if (child == null) {
                return root.val; 
            }
            int childClosest = closestValue(child, target);
            return Math.abs(root.val - target) < Math.abs(childClosest - target) ? root.val : childClosest;
        }
    }
    

    Python: Iteration, Time: O(h), Space: O(1)

    # Definition for a binary tree node.
    # class TreeNode(object):
    #     def __init__(self, x):
    #         self.val = x
    #         self.left = None
    #         self.right = None
    
    class Solution(object):
        def closestValue(self, root, target):
            """
            :type root: TreeNode
            :type target: float
            :rtype: int
            """
            gap = float("inf")
            closest = float("inf")
            while root:
                if abs(root.val - target) < gap:
                    gap = abs(root.val - target)
                    closest = root
                if target == root.val:
                    break
                elif target < root.val:
                    root = root.left
                else:
                    root = root.right
            return closest.val
    

    C++: Iteration

    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    class Solution {
    public:
        int closestValue(TreeNode* root, double target) {
            double gap = numeric_limits<double>::max();
            int closest = numeric_limits<int>::max();
            
            while (root) {
                if (abs(static_cast<double>(root->val) - target) < gap) {
                    gap = abs(root->val - target);
                    closest = root->val;
                }
                if (target == root->val) {
                    break;
                } else if (target < root->val) {
                    root = root->left;
                } else {
                    root = root->right;
                }
            }
            return closest;
        }
    }; 

    C++: Iteration

    class Solution {
    public:
        int closestValue(TreeNode* root, double target) {
            int res = root->val;
            while (root) {
                if (abs(res - target) >= abs(root->val - target)) {
                    res = root->val;
                }
                root = target < root->val ? root->left : root->right;
            }
            return res;
        }
    };
    

    C++: Recursion

    class Solution {
    public:
        int closestValue(TreeNode* root, double target) {
            int a = root->val;
            TreeNode *t = target < a ? root->left : root->right;
            if (!t) return a;
            int b = closestValue(t, target);
            return abs(a - target) < abs(b - target) ? a : b;
        }
    };
    

    C++: Recursion

    class Solution {
    public:
        int closestValue(TreeNode* root, double target) {
            int res = root->val;
            if (target < root->val && root->left) {
                int l = closestValue(root->left, target);
                if (abs(res - target) >= abs(l - target)) res = l;
            } else if (target > root->val && root->right) {
                int r = closestValue(root->right, target);
                if (abs(res - target) >= abs(r - target)) res = r;
            }
            return res;
        }
    };  

    类似题目:

      

    All LeetCode Questions List 题目汇总

  • 相关阅读:
    一网友推荐的书:框架设计(第2版):CLR Via C#
    线程与WinForm设计,防冻结,卡住窗体
    通用数据库操作辅助类DbHelper
    高级着色器语言(High Level Shader Language,简称HLSL)
    无法将 匿名方法 转换为类型“System.Delegate”,因为它不是委托类型
    根据RGB,计算灰度值
    温故而知新:WinForm/Silverlight多线程编程中如何更新UI控件的值
    [原创视频]PHP在netbeans中的简单使用
    自己封装的ASP.NET的SQLITE数据库的操作类
    《JavaScript征途》读后感
  • 原文地址:https://www.cnblogs.com/lightwindy/p/8636936.html
Copyright © 2020-2023  润新知