• 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.

    本题我用了变形题2的思路来做的,时间用的太长了,代码如下:

     1 /**
     2  * Definition for a binary tree node.
     3  * public class TreeNode {
     4  *     int val;
     5  *     TreeNode left;
     6  *     TreeNode right;
     7  *     TreeNode(int x) { val = x; }
     8  * }
     9  */
    10 public class Solution {
    11     public int closestValue(TreeNode root, double target) {
    12         Stack<TreeNode> succ = new Stack<TreeNode>();
    13         Stack<TreeNode> pre = new Stack<TreeNode>();
    14         initalizesucc(succ,root,target);
    15         initalizepre(pre,root,target);
    16         if(succ.isEmpty()){
    17             return pre.peek().val;
    18         }else if(pre.isEmpty()){
    19             return succ.peek().val;
    20         }else{
    21             double succ_diff = Math.abs((double)succ.peek().val-target);
    22             double pre_diff = Math.abs((double)pre.peek().val-target);
    23             if(succ_diff<pre_diff) return succ.peek().val;
    24             else return pre.peek().val;
    25         }
    26     }
    27     public void initalizesucc(Stack<TreeNode> stack,TreeNode root,double target){
    28         while(root!=null){
    29             if(root.val==target){
    30                 stack.push(root);
    31                 break;
    32             }else if(root.val<target){
    33                 root = root.right;
    34             }else{
    35                 stack.push(root);
    36                 root = root.left;
    37             }
    38         }
    39     }
    40     public void initalizepre(Stack<TreeNode> stack,TreeNode root,double target){
    41         while(root!=null){
    42             if(root.val==target){
    43                 stack.push(root);
    44                 break;
    45             }else if(root.val<target){
    46                 stack.push(root);
    47                 root = root.right;
    48             }else{
    49                 root = root.left;
    50             }
    51         }
    52     }
    53 }

    本题还有更为简单的办法,思路是使用递归来做,找出与target左面和右面最近的两个值,返回差值较小者。代码如下:

     1 /**
     2  * Definition for a binary tree node.
     3  * public class TreeNode {
     4  *     int val;
     5  *     TreeNode left;
     6  *     TreeNode right;
     7  *     TreeNode(int x) { val = x; }
     8  * }
     9  */
    10 public class Solution {
    11     public int closestValue(TreeNode root, double target) {
    12         int a = root.val;
    13         TreeNode child = target<a?root.left:root.right;
    14         if(child==null) return a;
    15         int b = closestValue(child,target);
    16         return Math.abs(a-target)<Math.abs(b-target)?a:b;
    17     }
    18 }
  • 相关阅读:
    Java零基础学习(四)JSP与Servlet
    Java零基础学习(三)封装继承多态
    vsftpd+nginx搭建图片服务器的一些问题
    1003. 我要通过!(20)(两种语言的运行时间差异)
    acm 1108 java做法
    acm 2020 用java实现
    acm 2519 java做法
    acm 2040 java做法
    acm 2003 java做法
    acm 2041 java的做法
  • 原文地址:https://www.cnblogs.com/codeskiller/p/6609277.html
Copyright © 2020-2023  润新知