zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    1253:抓住那头牛
    1251:仙岛求药
    1330:【例8.3】最少步数
    1329:【例8.2】细胞
    1216:红与黑
    1217:棋盘问题
    回溯法与深度优先搜索的关系
    自然数的拆分
    100——第35例
    100——第34例
  • 原文地址:https://www.cnblogs.com/codeskiller/p/6609277.html
Copyright © 2011-2022 走看看