Skip to content

Commit e56a345

Browse files
committed
236. Lowest Common Ancestor of a Binary Tree
1 parent 07cafba commit e56a345

File tree

1 file changed

+70
-0
lines changed

1 file changed

+70
-0
lines changed
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
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

Comments
 (0)