Skip to content

Commit 926b9e2

Browse files
EASY/src/easy/ClosestBinarySearchTreeValue.java
1 parent 1fcbeb3 commit 926b9e2

File tree

1 file changed

+84
-0
lines changed

1 file changed

+84
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
package easy;
2+
3+
import classes.TreeNode;
4+
5+
public class ClosestBinarySearchTreeValue {
6+
7+
class General_tree_solution {
8+
//this finished in 1 ms
9+
public int closestValue(TreeNode root, double target) {
10+
if (root == null)
11+
return 0;
12+
double delta = Double.MAX_VALUE;
13+
return dfs(root, target, delta, root.val);
14+
}
15+
16+
private int dfs(TreeNode root, double target, double delta, int closestVal) {
17+
if (Math.abs(root.val - target) < delta) {
18+
closestVal = root.val;
19+
delta = Math.abs(root.val - target);
20+
}
21+
int leftVal = closestVal;
22+
if (root.left != null)
23+
leftVal = dfs(root.left, target, delta, closestVal);
24+
int rightVal = closestVal;
25+
if (root.right != null)
26+
rightVal = dfs(root.right, target, delta, closestVal);
27+
return (Math.abs(leftVal - target) > Math.abs(rightVal - target)) ? rightVal : leftVal;
28+
}
29+
}
30+
31+
class BST_solution_recursive{
32+
//we can tailor the solution to use the BST feature: left subtrees are always smaller than the root the right subtrees
33+
//this finished in 0 ms
34+
public int closestValue(TreeNode root, double target) {
35+
if(root == null) return 0;
36+
return dfs(root, target, root.val);
37+
}
38+
39+
private int dfs(TreeNode root, double target, int minVal) {
40+
if(root == null) return minVal;
41+
if(Math.abs(root.val - target) < Math.abs(minVal - target)){
42+
minVal = root.val;
43+
}
44+
if(target < root.val){
45+
minVal = dfs(root.left, target, minVal);
46+
} else {
47+
minVal = dfs(root.right, target, minVal);
48+
}
49+
return minVal;
50+
}
51+
}
52+
53+
class General_tree_solution_more_concise{
54+
public int closestValue(TreeNode root, double target) {
55+
if(root == null) return 0;
56+
return dfs(root, target, root.val);
57+
}
58+
59+
private int dfs(TreeNode root, double target, int minVal) {
60+
if (root == null)
61+
return minVal;
62+
if (Math.abs(root.val - target) < Math.abs(minVal - target)) {
63+
minVal = root.val;
64+
}
65+
minVal = dfs(root.left, target, minVal);
66+
minVal = dfs(root.right, target, minVal);
67+
return minVal;
68+
}
69+
}
70+
71+
class BST_solution_iterative{
72+
public int closestValue(TreeNode root, double target) {
73+
long minVal = Long.MAX_VALUE;
74+
while(root != null){
75+
if(Math.abs(root.val - target) < Math.abs(minVal - target)){
76+
minVal = root.val;
77+
}
78+
if(target < root.val) root = root.left;
79+
else root = root.right;
80+
}
81+
return minVal == Long.MAX_VALUE ? 0 : (int) minVal;
82+
}
83+
}
84+
}

0 commit comments

Comments
 (0)