1818public  class  ClosestBinarySearchTreeValue  {
1919
2020    /** 
21-      * @param node  
22-      * @param parentNode  
23-      * @param val  
24-      * @param diff  
21+      * Runtime: <a href="https://leetcode.com/submissions/detail/248841443/">0 ms</a>.  
22+      * 
23+      * @param root  
24+      * @param target  
2525     * @return 
2626     */ 
27-     public  static  TreeNode   findNodeWithClosestValue (TreeNode  node ,  TreeNode   parentNode ,  int   val ,  int   diff ) {
28-         if  (node  == null ) return  parentNode ;
27+     public  static  int   closestValue (TreeNode  root ,  double   target ) {
28+         if  (root  == null ) return  - 1 ;
2929
30-         if  (Math .abs (node .val  - val ) > diff ) return  parentNode ;
30+         return  closestValue (root , root , target );
31+     }
32+ 
33+     private  static  int  closestValue (TreeNode  node , TreeNode  closestNode , double  val ) {
34+         if  (node  == null ) return  closestNode .val ;
35+ 
36+         if  (Math .abs (node .val  - val ) < Math .abs (closestNode .val  - val )) {
37+             closestNode  = node ;
38+         }
3139
3240        if  (node .val  > val ) {
33-             return  findNodeWithClosestValue (node .left , node , val ,  Math . abs ( node . val  -  val ) );
41+             return  closestValue (node .left , closestNode , val );
3442        } else  {
35-             return  findNodeWithClosestValue (node .right , node , val ,  Math . abs ( node . val  -  val ) );
43+             return  closestValue (node .right , closestNode , val );
3644        }
3745    }
3846
@@ -54,17 +62,17 @@ public static void main(String[] args) {
5462        root .right  = new  TreeNode (13 );
5563        root .left .left  = new  TreeNode (5 );
5664        root .left .right  = new  TreeNode (8 );
57-         root .left .left .left  = new  TreeNode (2 );
5865        root .left .left .right  = new  TreeNode (6 );
66+         root .left .left .left  = new  TreeNode (2 );
5967        root .right .right  = new  TreeNode (20 );
6068
61-         assertEquals (13 , findNodeWithClosestValue (root , root ,  15 ,  Integer . MAX_VALUE ). val );
62-         assertEquals (13 , findNodeWithClosestValue (root , root ,  13 ,  Integer . MAX_VALUE ). val );
63-         assertEquals (9 , findNodeWithClosestValue (root , root ,  9 ,  Integer . MAX_VALUE ). val );
64-         assertEquals (2 , findNodeWithClosestValue (root , root ,  2 ,  Integer . MAX_VALUE ). val );
65-         assertEquals (2 , findNodeWithClosestValue (root , root ,  1 ,  Integer . MAX_VALUE ). val );
66-         assertEquals (6 , findNodeWithClosestValue (root , root ,  6 ,  Integer . MAX_VALUE ). val );
67-         assertEquals (13 , findNodeWithClosestValue (root , root ,  11 ,  Integer . MAX_VALUE ). val ); // tie b/w 9 and 13 
69+         assertEquals (13 , closestValue (root , 15 ) );
70+         assertEquals (13 , closestValue (root , 13 ) );
71+         assertEquals (9 , closestValue (root , 9 ) );
72+         assertEquals (2 , closestValue (root , 2 ) );
73+         assertEquals (2 , closestValue (root , 1 ) );
74+         assertEquals (6 , closestValue (root , 6 ) );
75+         assertEquals (13 , closestValue (root , 11 ) ); // tie b/w 9 and 13 
6876
6977        /* 
7078            BST looks like: 
@@ -83,6 +91,20 @@ public static void main(String[] args) {
8391        root .right .left  = new  TreeNode (13 );
8492        root .right .right  = new  TreeNode (20 );
8593
86-         assertEquals (13 , findNodeWithClosestValue (root , root , 15 , Integer .MAX_VALUE ).val );
94+         assertEquals (13 , closestValue (root , 15 ));
95+ 
96+         /* 
97+             BST looks like: 
98+ 
99+                     1500000000 
100+                         / 
101+                        / 
102+                       / 
103+                  1400000000 
104+          */ 
105+         root  = new  TreeNode (1500000000 );
106+         root .left  = new  TreeNode (1400000000 );
107+ 
108+         assertEquals (1400000000 , closestValue (root , -1500000000.0 ));
87109    }
88110}
0 commit comments