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 }
原文地址:https://www.cnblogs.com/codeskiller/p/6609277.html