class Node:
def __init__(self, value):
self.value = value
self.children = []
def tree(li):
nodes = [Node(i) for i in li]
for i in range(1, len(li)):
nodes[(i - 1) // 2].children.append(nodes[i])
return nodes[0]
def calc(node, level=0):
if node is None:
return 0
return (node.value if level % 2 == 1 else 0) + sum(calc(n, level + 1) for n in node.children)
li = [3, 5, 8, 12, 15, 18, 21]
root = tree(li)
print(calc(root))
level % 2 == 1) 확인for i in range(1, len(li)):
nodes[(i - 1) // 2].children.append(nodes[i])
(i - 1) // 2는 이진 트리의 부모 인덱스 계산 공식이다.| i | 부모 인덱스 ( (i-1)//2 ) | 부모값 | 자식값 |
|---|---|---|---|
| 1 | 0 | 3 | 5 |
| 2 | 0 | 3 | 8 |
| 3 | 1 | 5 | 12 |
| 4 | 1 | 5 | 15 |
| 5 | 2 | 8 | 18 |
| 6 | 2 | 8 | 21 |
➡ 트리 구조를 그리면 아래와 같다:
3(level 0)
/ \
5(level 1) 8(level 1)
/ \ / \
12(2) 15(2) 18(2) 21(2)
calc(node, level) 함수 분석return (node.value if level % 2 == 1 else 0) + sum(calc(n, level + 1) for n in node.children)
level+1) 탐색| 레벨(level) | 노드 값 | 포함 여부 (level % 2 == 1) | 누적 합 |
|---|---|---|---|
| 0 | 3 | ❌ | 0 |
| 1 | 5, 8 | ✅ | 5 + 8 = 13 |
| 2 | 12, 15, 18, 21 | ❌ | +0 |
따라서 최종 합은
13
13
이 문제에서 꼭 알아야 할 개념:
(i - 1) // 2sum(calc(n, level + 1) for n in node.children) 로 하위 노드 전체 탐색