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.

 Inorder Traversal:

 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         if (root == null) return Integer.MIN_VALUE;
13         ArrayList<Integer> preVal = new ArrayList<Integer>();
14         ArrayList<Integer> res = new ArrayList<Integer>();
15         helper(root, target, preVal, res);
16         if (res.size() == 0) {
17             res.add(preVal.get(0));
18         }
19         return res.get(0);
20     }
21     
22     public void helper(TreeNode root, double target, ArrayList<Integer> preVal, ArrayList<Integer> res) {
23         if (root == null) return;
24         helper(root.left, target, preVal, res);
25         if (preVal.size() == 0) {
26             preVal.add(root.val);
27         }
28         else if (root.val >= target) {
29             if (res.size()==0)
30                 res.add(Math.abs((double)(preVal.get(0)-target))<Math.abs((double)(root.val-target))? preVal.get(0) : root.val);
31             return;
32         }
33         else {
34             preVal.set(0, root.val);
35         }
36         helper(root.right, target, preVal, res);
37     }
38 }

 Recursion: (转)根据二叉树的性质,我们知道当遍历到某个根节点时,最近的那个节点要么是在子树里面,要么就是根节点本身。所以我们根据这个递归,返回子树中最近的节点,和根节点中更近的那个就行了。

 1 public class Solution {
 2     public int closestValue(TreeNode root, double target) {
 3         // 选出子树的根节点
 4         TreeNode kid = target < root.val ? root.left : root.right;
 5         // 如果没有子树,也就是递归到底时,直接返回当前节点值
 6         if(kid == null) return root.val;
 7         // 找出子树中最近的那个节点
 8         int closest = closestValue(kid, target);
 9         // 返回根节点和子树最近节点中,更近的那个节点
10         return Math.abs(root.val - target) < Math.abs(closest - target) ? root.val : closest;
11     }
12 }

Iteration: (转)

 1 public class Solution {
 2     public int closestValue(TreeNode root, double target) {
 3         int closest = root.val;
 4         while(root != null){
 5             // 如果该节点的离目标更近,则更新到目前为止的最近值
 6             closest = Math.abs(closest - target) < Math.abs(root.val - target) ? closest : root.val;
 7             // 二叉搜索
 8             root = target < root.val ? root.left : root.right;
 9         }
10         return closest;
11     }
12 }