Skip to content

Commit 6f7c970

Browse files
committed
Add Lowest Common Ancestor
1 parent b6d3024 commit 6f7c970

File tree

1 file changed

+40
-0
lines changed

1 file changed

+40
-0
lines changed

kotlin/Trees/LowestCommonAncestor.kt

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import ds.TreeNode
2+
3+
/*
4+
Definition of TreeNode:
5+
6+
data class TreeNode(
7+
var value: Int,
8+
var left: TreeNode? = null,
9+
var right: TreeNode? = null
10+
)
11+
*/
12+
13+
fun lowestCommonAncestor(root: TreeNode?, p: TreeNode?, q: TreeNode?): TreeNode? {
14+
var lca: MutableList<TreeNode?> = mutableListOf(null)
15+
dfs(root, p, q, lca)
16+
return lca[0]
17+
}
18+
19+
fun dfs(node: TreeNode?, p: TreeNode?, q: TreeNode?, lca: MutableList<TreeNode?>): Boolean {
20+
// Base case: a null node is neither 'p' nor 'q'.
21+
if (node == null) {
22+
return false
23+
}
24+
val nodeIsPOrQ = node == p || node == q
25+
// Recursively determine if the left and right subtrees contain 'p'
26+
// or 'q'.
27+
val leftContainsPOrQ = dfs(node.left, p, q, lca)
28+
val rightContainsPOrQ = dfs(node.right, p, q, lca)
29+
// If two of the above three variables are true, the current node is
30+
// the LCA.
31+
if ((nodeIsPOrQ && leftContainsPOrQ) ||
32+
(nodeIsPOrQ && rightContainsPOrQ) ||
33+
(leftContainsPOrQ && rightContainsPOrQ)
34+
) {
35+
lca[0] = node
36+
}
37+
38+
// Return true if the current subtree contains 'p' or 'q'.
39+
return nodeIsPOrQ || leftContainsPOrQ || rightContainsPOrQ
40+
}

0 commit comments

Comments
 (0)