1
+ 'use strict' ;
2
+ class Node {
3
+ constructor ( data ) {
4
+ this . data = data ;
5
+ this . leftNode = this . rightNode = null ;
6
+ }
7
+ }
8
+
9
+ function LCA ( root , data1 , data2 ) {
10
+ if ( root == null ) return null ;
11
+ if ( root . data == data1 || root . data == data2 ) return root ;
12
+ let leftLCA = LCA ( root . leftNode , data1 , data2 ) ;
13
+ let rightLCA = LCA ( root . rightNode , data1 , data2 ) ;
14
+ if ( leftLCA != null && rightLCA != null ) return root ;
15
+ return leftLCA != null ? leftLCA : rightLCA ;
16
+ }
17
+
18
+ //level - 1
19
+ let tree = new Node ( 1 ) ;
20
+
21
+ // level - 2
22
+ tree . leftNode = new Node ( 2 ) ;
23
+ tree . rightNode = new Node ( 3 ) ;
24
+
25
+ // level - 3
26
+ tree . leftNode . leftNode = new Node ( 4 ) ;
27
+ tree . leftNode . rightNode = new Node ( 5 ) ;
28
+
29
+ tree . rightNode . leftNode = new Node ( 6 ) ;
30
+ tree . rightNode . rightNode = new Node ( 7 ) ;
31
+
32
+ // level - 4
33
+ tree . leftNode . leftNode . leftNode = new Node ( 8 ) ;
34
+ tree . leftNode . leftNode . rightNode = new Node ( 9 ) ;
35
+
36
+ tree . leftNode . rightNode . leftNode = new Node ( 10 ) ;
37
+ tree . leftNode . rightNode . rightNode = new Node ( 11 ) ;
38
+
39
+ tree . rightNode . leftNode . leftNode = new Node ( 12 ) ;
40
+ tree . rightNode . leftNode . rightNode = new Node ( 13 ) ;
41
+
42
+ tree . rightNode . rightNode . leftNode = new Node ( 14 ) ;
43
+ tree . rightNode . rightNode . rightNode = new Node ( 15 ) ;
44
+ // 1
45
+ // / \
46
+ // 2 3
47
+ // / \ / \
48
+ // 4 5 6 7
49
+ // / \ / \ / \ / \
50
+ // 8 9 10 11 12 13 14 15
51
+ let k1 = 4 , k2 = 10 ;
52
+ let lcaNode = LCA ( tree , k1 , k2 ) ;
53
+ console . log ( 'LCA of ' + k1 + ' and ' + k2 + ' => ' , lcaNode != null ? lcaNode . data : 0 ) ;
0 commit comments