2024년 1월 10일 (수)
Leetcode daily problem
https://leetcode.com/problems/amount-of-time-for-binary-tree-to-be-infected/description/
고유한 정수 값을 가지는 이진 트리가 주어진다.
트리의 노드 하나를 탐색하는데 시간이 1씩 늘어난다.
루트 노드가 아닌 랜덤의 노드에서 시작할 때, 전체 트리를 탐색하는 필요한 시간을 반환한다.
Tree (binary tree)
루트 노드를 탐색하면서, 해당 노드에 해당하는 left, right 노드에 대해 저장한다.
queue 를 생성하고, 시작 노드에 따라서 노드를 탐색하면서 방문한 노드를 따로 저장하고 방문하지 않는 노드를 다 탐색할 때마다 시간을 더하고 마지막 전체 노드를 모두 반복했으면 최종 시간을 반환한다.
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def amountOfTime(self, root: Optional[TreeNode], start: int) -> int:
def dfs(node):
if not node:
return
if node.left:
graph[node.val].append(node.left.val)
graph[node.left.val].append(node.val)
if node.right:
graph[node.val].append(node.right.val)
graph[node.right.val].append(node.val)
dfs(node.left)
dfs(node.right)
graph = defaultdict(list)
dfs(root)
visited = set()
queue = deque([start])
ans = -1
while queue:
ans +=1
for _ in range(len(queue)):
cur_node = queue.popleft()
visited.add(cur_node)
for neighbor in graph[cur_node]:
if neighbor not in visited:
queue.append(neighbor)
return ans
시간 복잡도
트리의 모든 노드를 한 번 방문하므로 시간 복잡도는 O(N)이다.
(N : 노드의 총 수)
공간 복잡도
그래프를 나타내기 위해 defaultdict를 사용하고, 각 노드의 이웃을 저장하는데, 이 과정에서 그래프의 공간 복잡도는 O(N)이다.
방문한 노드를 저장하는 데 사용되는 세트의 공간 복잡도는 최악의 경우 O(N)가 된다. 또한 큐에 최악의 경우 모든 노드가 들어갈 수 있으므로 큐의 공간 복잡도는 O(N)로,
따라서 전체 공간 복잡도는 O(N)이다.