[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 题目汇总
[LeetCode] 270. Closest Binary Search Tree Value 最近的二叉搜索树的值的更多相关文章
- [LeetCode] 272. Closest Binary Search Tree Value II 最近的二分搜索树的值之二
Given a non-empty binary search tree and a target value, find k values in the BST that are closest t ...
- [LeetCode] Trim a Binary Search Tree 修剪一棵二叉搜索树
Given a binary search tree and the lowest and highest boundaries as L and R, trim the tree so that a ...
- [LeetCode] Closest Binary Search Tree Value II 最近的二分搜索树的值之二
Given a non-empty binary search tree and a target value, find k values in the BST that are closest t ...
- 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 t ...
- [leetcode]270. Closest Binary Search Tree Value二叉搜索树中找target的最接近值
Given a non-empty binary search tree and a target value, find the value in the BST that is closest t ...
- leetCode 95.Unique Binary Search Trees II (唯一二叉搜索树) 解题思路和方法
Given n, generate all structurally unique BST's (binary search trees) that store values 1...n. For e ...
- 109 Convert Sorted List to Binary Search Tree 有序链表转换二叉搜索树
给定一个单元链表,元素按升序排序,将其转换为高度平衡的BST.对于这个问题,一个高度平衡的二叉树是指:其中每个节点的两个子树的深度相差不会超过 1 的二叉树.示例:给定的排序链表: [-10, -3, ...
- Leetcode109. Convert Sorted List to Binary Search Tree有序链表转换二叉搜索树
给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 示例: 给定的有序链表: [-10 ...
- [LeetCode] 272. Closest Binary Search Tree Value II 最近的二叉搜索树的值 II
Given a non-empty binary search tree and a target value, find k values in the BST that are closest t ...
随机推荐
- 使用python的jira库操作jira的版本单和问题单链接
操作JIRA的API来实现的. 但感觉比单纯操作API要简单一些. from jira import JIRA from django.conf import settings JIRA_URL = ...
- c和c++区别(未整理)
学习完C语言和c++比较一下他们之间的区别: c++是c语言的基础上开发的一种面向对象的编程语言,应用十分广泛,按理说c++可以编译任何c的程序,但是两者还是有细微的差别. c++在c的基础上添加了类 ...
- test20190905 ChiTongZ
100+22+90=212.前两道题不错,但T3 没什么意义. 围观刘老爷超强 T1 解法. ChiTongZ的水题赛 [题目简介] 我本可以容忍黑暗,如果我不曾见过太阳. 考试内容略有超纲,不超纲的 ...
- django-带参数路由
路由urls.py from django.conf.urls import url from goods.views import IndexView, DetailView, ListView u ...
- App版本更新接口的设计
前段时间公司业务调整,新开了新的移动端的项目,所以和朋友聊到了“版本号”和“版本更新所需的数据表设计”. 一般来讲大部分的软件版本号分3段,比如 A.B.C A 表示大版本号,一般当软件整体重写,或出 ...
- 全局异常捕获处理-@ControllerAdvice+@HandleException
涂涂影院管理系统这个demo中有个异常管理的标签,用于捕获 涂涂影院APP用户异常信息 ,有小伙伴好奇,排除APP,后台端的是如何处理全局异常的,故项目中的实际应用已记之. 关于目前的异常处理 在使用 ...
- Time Frequency (T-F) Masking Technique
时频掩蔽技术. 掩蔽效应 声掩蔽(auditory masking)是指一个声音的听阈因另一个声音的存在而上升的现象.纯音被白噪声所掩蔽时,纯音听阈上升的分贝数,主要决定于以纯音频率为中心一个窄带噪声 ...
- 查看.NET应用程序中的异常(下)
为什么要使用内存转储进行调试? 在两种主要情况下,您可能需要使用内存转储进行调试.第一种情况是应用程序有一个未处理的异常并崩溃,而您只有一个内存转储.第二种情况是,在生产环境中出现异常或特定行为,并且 ...
- mov offset和lea的区别
mov offset和lea的区别 原文地址:https://www.cnblogs.com/fanzi2009/archive/2011/11/29/2267725.html 全局变量取地址用mo ...
- nexus 3.17.0 做为golang 的包管理工具
nexus 3.17.0 新版本对于go 包管理的支持是基于go mod 的,同时我们也需要一个athens server 然后在nexus 中配置proxy 类型的repo 参考配置 来自官方的配置 ...