Zero to Hero
article thumbnail
Published 2021. 4. 8. 14:57
310. Minimum Height Trees Algorithm
 

Minimum Height Trees - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

1. Brute Force DFS (시간 초과)

from typing import *
from collections import defaultdict


class Solution:
    def findMinHeightTrees(self, n: int, edges: List[List[int]]) -> List[int]:
        graph = defaultdict(set)
        for edge in edges:
            src, dsc = edge
            graph[src].add(dsc)
            graph[dsc].add(src)

        def sol(cur, graph, visited):
            visited[cur] = 1
            res, flag = 0, 0
            for adj in graph[cur]:
                if not visited[adj]:
                    flag = 1
                    res = max(sol(adj, graph, visited), res)
            if not flag:
                return 1
            return res + 1

        min_height, answer = float("inf"), [0]
        for node in graph:
            temp = sol(node, graph, [0] * n)
            if temp < min_height:
                min_height = temp
                answer = [node]
            elif temp == min_height:
                answer.append(node)
        return answer

 

2. Topological Sort (위상 정렬) 응용

from typing import *
from collections import defaultdict, deque


class Solution:
    def findMinHeightTrees(self, n: int, edges: List[List[int]]) -> List[int]:
        if len(edges) == 1:
            return edges[0]

        graph = defaultdict(set)
        indegree = [0] * n
        for edge in edges:
            src, dsc = edge
            graph[src].add(dsc)
            graph[dsc].add(src)
            indegree[src] += 1
            indegree[dsc] += 1
        q = deque([])
        for node in graph:
            if indegree[node] == 1:
                q.append(node)
        left_node_num = n
        answer = [0]
        while left_node_num > 2:
            deleted_node, candi_node = [], []
            while q:
                cur = q.popleft()
                deleted_node.append(cur)
                for adj in graph[cur]:
                    graph[adj].remove(cur)
                    indegree[adj] -= 1
                    if indegree[adj] == 1:
                        candi_node.append(adj)
            left_node_num -= len(deleted_node)
            q = deque(candi_node)
            answer = candi_node
        return answer

3. Tree DP 

추후 기술

'Algorithm' 카테고리의 다른 글

743. Network Delay Time  (0) 2021.04.11
338. Counting Bits  (0) 2021.04.09
287. Find the Duplicate Number  (0) 2021.04.07
238. Product of Array Except Self  (0) 2021.04.06
46. Permutations  (0) 2021.04.05
profile

Zero to Hero

@Doljae

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!