-
Notifications
You must be signed in to change notification settings - Fork 236
/
Copy pathyoungest-common-ancestor.py
61 lines (48 loc) · 1.48 KB
/
youngest-common-ancestor.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# YOUNGEST COMMON ANCESTOR
# This is an input class. Do not edit.
class AncestralTree:
def __init__(self, name):
self.name = name
self.ancestor = None
# O(D) time and space
def getYoungestCommonAncestor(topAncestor, descendantOne, descendantTwo):
# Write your code here.
visited = set()
while descendantOne != topAncestor:
visited.add(descendantOne)
descendantOne = descendantOne.ancestor
while descendantTwo != topAncestor:
if descendantTwo in visited:
return descendantTwo
descendantTwo = descendantTwo.ancestor
return topAncestor
# This is an input class. Do not edit.
class AncestralTree:
def __init__(self, name):
self.name = name
self.ancestor = None
# O(D) time and O(1) space
def getYoungestCommonAncestor(topAncestor, descendantOne, descendantTwo):
# Write your code here.
depthOne = 0
depthTwo = 0
tempOne = descendantOne
tempTwo = descendantTwo
while descendantOne != topAncestor:
depthOne += 1
descendantOne = descendantOne.ancestor
while descendantTwo != topAncestor:
depthTwo += 1
descendantTwo = descendantTwo.ancestor
deeperNode = tempOne if depthOne > depthTwo else tempTwo
shallowNode = tempOne if depthOne <= depthTwo else tempTwo
i = 0
while i < abs(depthOne - depthTwo):
deeperNode = deeperNode.ancestor
i += 1
while deeperNode != None:
if deeperNode == shallowNode:
return deeperNode
deeperNode = deeperNode.ancestor
shallowNode = shallowNode.ancestor
return None