1
+ /**
2
+ * Definition for a binary tree node.
3
+ * class TreeNode(var _value: Int) {
4
+ * var value: Int = _value
5
+ * var left: TreeNode = null
6
+ * var right: TreeNode = null
7
+ * }
8
+ */
9
+
10
+
11
+ class TreeNode (_value : Int = 0 , _left : TreeNode = null , _right : TreeNode = null ) {
12
+ var value : Int = _value
13
+ var left : TreeNode = _left
14
+ var right : TreeNode = _right
15
+ }
16
+
17
+ object Solution {
18
+ // quick first solution - todo: make it better
19
+ def lowestCommonAncestor (root : TreeNode , p : TreeNode , q : TreeNode ): TreeNode = {
20
+ var lca : TreeNode = null
21
+ def dfs (node : TreeNode ): (Boolean , Boolean ) = {
22
+ if (node != null ) {
23
+ // println(s"[${node.value}]")
24
+ val foundP = node.value == p.value
25
+ val foundQ = node.value == q.value
26
+ val (frp, frq) = dfs(node.right)
27
+ val (flp, flq) = dfs(node.left)
28
+
29
+ // this is pzdc)
30
+ val found = {
31
+ if (frp && frq) { lca = node; true }
32
+ else if (flp && flq) { lca = node; true }
33
+ else if (frp && flq) { lca = node; true }
34
+ else if (flp && frq) { lca = node; true }
35
+ else if (frp && (node.value == q.value)) { lca = node; true }
36
+ else if (flp && (node.value == q.value)) { lca = node; true }
37
+ else if (frq && (node.value == p.value)) { lca = node; true }
38
+ else if (flq && (node.value == p.value)) { lca = node; true }
39
+ else false
40
+ }
41
+
42
+ if (found) (false , false ) else (foundP || frp || flp, foundQ || frq || flq)
43
+ } else (false , false )
44
+ }
45
+ dfs(root)
46
+ lca
47
+ }
48
+ }
49
+
50
+
51
+ val tree1 = new TreeNode (3 ,
52
+ new TreeNode (5 ,
53
+ new TreeNode (6 ),
54
+ new TreeNode (7 )
55
+ ),
56
+ new TreeNode (1 ,
57
+ new TreeNode (4 ),
58
+ new TreeNode (2 ,
59
+ new TreeNode (9 ),
60
+ new TreeNode (11 ,
61
+ new TreeNode (8 ),
62
+ new TreeNode (10 )
63
+ )
64
+ )
65
+ )
66
+ )
67
+
68
+ Solution .lowestCommonAncestor(tree1, new TreeNode (11 ), new TreeNode (10 )).value // 11
69
+ Solution .lowestCommonAncestor(tree1, new TreeNode (8 ), new TreeNode (10 )).value // 11
70
+ Solution .lowestCommonAncestor(tree1, new TreeNode (7 ), new TreeNode (8 )).value // 11
0 commit comments