forked from tiationg-kho/leetcode-pattern-500
-
Notifications
You must be signed in to change notification settings - Fork 0
/
310-minimum-height-trees.py
34 lines (31 loc) · 1.05 KB
/
310-minimum-height-trees.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
from collections import deque, defaultdict
class Solution:
def findMinHeightTrees(self, n: int, edges: List[List[int]]) -> List[int]:
if n == 1:
return [0]
graph = defaultdict(set)
for start, end in edges:
graph[start].add(end)
graph[end].add(start)
queue = deque()
for node, children in graph.items():
if len(children) == 1:
queue.append(node)
while queue:
length = len(queue)
res = []
for _ in range(length):
node = queue.popleft()
res.append(node)
for next_node in graph[node]:
graph[next_node].remove(node)
if len(graph[next_node]) == 1:
queue.append(next_node)
return res
# time O(V+E)
# space O(V+E), due to building graph
# using graph and kahn and topological sort
'''
1. we want the root node as center as possible
2. so start from removing all cur leaf nodes in each round
'''