[리트코드] 662. 이진트리의 최대 너비
2022. 3. 8. 07:52ㆍPython/코딩 문제
# 문제 설명
이진트리의 root가 주어질 때, 주어진 트리의 최대 너비를 반환해라. 여기서 최대 너비란 모든 level들 중에 최대로 하는 너비를 말한다.
한 level의 너비는 그 끝의 노드들 간의 길이로 정의한다. 노드들 사이의 null 노드들도 또한 길이 계산에 포함한다.
# 입출력 예시
입력 | 출력 |
[1,3,2,5,3,null,9] | 4 |
[1,3,null,5,3] | 2 |
[1,3,2,5] | 2 |
# 코드 풀이 1. queue를 이용하여 index 계산
# 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
from collections import deque
class Solution:
def widthOfBinaryTree(self, root: Optional[TreeNode]) -> int:
answer = 0
q = deque([(0, root)]) # index, node
while q:
n = len(q)
idxs = []
for _ in range(n):
index, node = q.popleft()
idxs.append(index)
if node.left:
q.append((index*2+1, node.left))
if node.right:
q.append((index*2+2, node.right))
answer = max(answer, max(idxs)-min(idxs)+1)
return answer
# 코드 풀이 2. 재귀를 이용하여 index 계산
# 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
from collections import defaultdict
class Solution:
def widthOfBinaryTree(self, root: Optional[TreeNode]) -> int:
depths = defaultdict(list) # level: index
def dfs(node, level, index):
if node:
depths[level].append(index)
dfs(node.left, level+1, index*2)
dfs(node.right, level+1, index*2+1)
dfs(root, 0, 0)
return max([max(depths[level]) - min(depths[level]) + 1 for level in depths])
# 핵심 포인트
- 한 level의 너비를 계산하기 위해, 각 level에서의 노드들의 index를 저장한다.
- index를 0부터 세면, 왼쪽 노드의 경우 항상 2의 배수고 오른쪽 노드는 그보다 항상 1이 크다.
참고 자료.
반응형
'Python > 코딩 문제' 카테고리의 다른 글
[리트코드] 704. Binary Search (0) | 2022.03.14 |
---|---|
[백준] 13398. 연속합 2 (0) | 2022.03.10 |
백준 3977. 축구 전술 (0) | 2022.03.04 |
[리트코드] 139. Word Break (0) | 2022.03.02 |
[리트코드] 100. Same Tree (0) | 2022.02.28 |