[637. Average of Levels in Binary Tree] (알고리즘)
BFS
문제
Given the root
of a binary tree, return the average value of the nodes on each level in the form of an array. Answers within 10-5
of the actual answer will be accepted.
Example 1:
Input: root = [3,9,20,null,null,15,7] Output: [3.00000,14.50000,11.00000] Explanation: The average value of nodes on level 0 is 3, on level 1 is 14.5, and on level 2 is 11. Hence return [3, 14.5, 11].
Example 2:
Input: root = [3,9,20,15,7] Output: [3.00000,14.50000,11.00000]
Constraints:
- The number of nodes in the tree is in the range
[1, 104]
. -231 <= Node.val <= 231 - 1
스스로 고민
접근법
- 각 층의 노드의 평균을 구해서 리스트로 반환하면된다.
1
/ \
2 3
/ \
4 X
- 예를 들어서
[1,2,3,4]
이렇게 있다고 가정하면 root 층의 평균은 1 - 그 다음 층의 (2 + 3) / 2평균은 2.5
- 그 다음 층은 4
- 반환은
[1, 2.5, 4]
이렇게 되며 소수점 5자리까지 허용한다. - 각 층의 평균을 구하는 거니까 BFS 가 제일 적합하다고 생각했다.
의사코드
- 복습도 할겸 deque 로 구현!
- 우선 None 값일 경우 빈 리스트를 반환해준다.
- 결과 값을 담아줄 리스트 result를 선언
- deque에 담아줌
- 초기 average 변수 설정
- floor 설정 -> 이진 트리니까 최대 갯수 2개
- 해당 트리에서 노드가 다 계산 될 때 까지 average에 계산 값이 중첩됨
- 해당 층에 노드 갯수로 정의해둔 floor로 나눠서 평균 값 계산
- 다시 와일문으로 반복 되면서 average 값과 floor 초기화
- 큐가 비어있을 때 까지 반복
구현 코드
from collections import deque
class Solution:
def averageOfLevels(self, root: Optional[TreeNode]) -> List[float]:
if not root:
return []
queue = deque([root])
result = []
while queue:
average = 0
floor = len(queue)
for i in range(floor):
node = queue.popleft()
if i <= floor - 1:
average += node.val
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
result.append(average/floor)
return result
시간 복잡도와 공간 복잡도
시간 복잡도: 이진 트리의 모든 노드를 한 번만 방문하므로 O(N) 다. 여기서 N은 이진 트리의 노드 수
공간 복잡도:
queue
변수는 BFS(너비 우선 탐색)를 위해 사용되는 큐다. 큐는 각 레벨의 노드를 저장하는 데 사용되므로, 각 레벨에 있는 노드 수의 합이 큐에 저장된다. 이것은 최악의 경우에는 트리의 마지막 레벨의 노드 수에 해당하므로 O(N)의 공간을 사용한다.result
변수는 각 레벨의 평균 값을 저장하는 리스트다. 결과 리스트는 최대 레벨 수와 같은 길이를 가질 수 있으므로 O(H)의 공간을 사용한다. 여기서 H는 트리의 높이
회고 과정
- 개념을 이해하니까 예전보다 문제 풀 때 확실히 수월하게 풀 수 있어서 좋았다.
- 예전에는 어떻게 풀어야 할지 전혀 감도 안 잡힐 때가 많았는데 이럴 때는 차라리 답을 보고 접근 방법이나 문제 풀이 방법에 대한 개념을 이해하는 게 중요한 것 같다.
다른 사람 코드를 보고 그 기준으로 어떤 부분을 개선 할 수 있는지 최종 회고
- 혹시 deque를 사용하지 않고 문제를 푼 사람이 있는지 찾아보았는데 대부분 deque를 사용하고 논리도 비슷해서 다른 사람의 코드를 보는 것 보다는 어떤 상황에서 deque를 사용하면 수월한지 생각해 보는 게 낫다고 생각했다.
- 특히 bfs, dfs 둘 다 한 번에 생각나게 연습을 해야겠다고 생각헀다.
댓글남기기