package com.freetymekiyan.algorithms.level.easy; import com.freetymekiyan.algorithms.utils.Utils.TreeNode; /** * Given a non-empty binary search tree and a target value, find the value in the BST that is closest to the target. * <p> * 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. * <p> * Company Tags: Microsoft, Google, Snapchat * Tags: Tree, Binary Search * Similar Problems: (M) Count Complete Tree Nodes, (H) Closest Binary Search Tree Value II */ public class ClosestBinarySearchTreeValue { /** * Binary Search. Recursive * Get root's value first, a. * If target < root's value, the next root will be left child. * Else it should be right child. * If the next root is null: * | Just return root's value. * Else get the closest value of next root, b. * Compare a and b, return the closer one. */ public int closestValue(TreeNode root, double target) { int a = root.val; TreeNode child = target < a ? root.left : root.right; if (child == null) { return a; } int b = closestValue(child, target); return Math.abs(a - target) < Math.abs(b - target) ? a : b; } /** * Binary Search. Iterative. * Initialize answer as root's value. * While root is not null: * | If target is closer to current node's value then result: * | Update result to current node's value. * | Otherwise, result remains the same. * | If target < current's value, move current node to left child. * | Else move current node to right child. * Return result. */ public int closestValue2(TreeNode root, double target) { TreeNode cur = root; int res = root.val; while (cur != null) { if (Math.abs(target - cur.val) < Math.abs(target - res)) { res = cur.val; } cur = target < cur.val ? cur.left : cur.right; } return res; } }