완전 이진 트리의 리프 노드에 1000이하의 자연수가 저장되어 있고, 리프 노드를 제외한 노드에는 자식 노드에 저장된 값의 합이 들어있다고 한다.
다음은 리프 노드에 저장된 1, 2, 3이 주어졌을 때, 나머지 노드에 자식 노드의 합을 저장한 예이다.

N개의 노드를 갖는 완전 이진 트리의 노드 번호는 루트가 1번이 되며, 같은 단계에서는 왼쪽에서 오른쪽으로 증가, 단계가 꽉 차면 다음단계의 왼쪽부터 시작된다.
완전 이진 트리의 특성상 1번부터 N번까지 빠지는 노드 번호는 없다.
리프 노드의 번호와 저장된 값이 주어지면 나머지 노드에 자식 노드 값의 합을 저장한 다음, 지정한 노드 번호에 저장된 값을 출력하는 프로그램을 작성 하시오.
첫 줄에 테스트케이스의 수 T가 주어진다. 1<=T<=50
다음 줄부터 테스트 케이스의 별로 노드의 개수 N과 리프 노드의 개수 M, 값을 출력할 노드 번호 L이 주어지고, 다음 줄부터 M개의 줄에 걸쳐 리프 노드 번호와 1000이하의 자연수가 주어진다.
각 줄마다 "#T" (T는 테스트 케이스 번호)를 출력한 뒤, 답을 출력한다.
maketree라는 함수를 만들어준다. 리프 노드들 부터 상단으로 올라갈 수록 빈 노드들에 자식노드의 합을 구해주기 위해 재귀호출을 해준다.
풀이 중에 typeError가 계속 나와서 해결하는중에 재귀호출할때 리턴값이 없어서 none+(int)를 해주려해서 typeError가 나왔다.
재귀호출시 리턴값을 꼭 넣어줘야 한다는것을 알게되었다.
def maketree(idx):
if idx <= N:
if tree[idx]: # 값이 있으면 그 값 리턴
return tree[idx]
else:
tree[idx] = maketree(idx * 2) + maketree(idx * 2 + 1)
return tree[idx]
else: #자식노드가 1개 뿐인데 부모노드가 비어있는경우 none+자식노드 인데, 이러면 문제발생하므로 0+자식노드 해주기위해 0반환
return 0
T = int(input())
for test_case in range(1, T+1):
N, M, L = map(int, input().split())
tree = [0]*(N+1)
for _ in range(M):
index, num = map(int, input().split())
tree[index] = num
maketree(1)
print(f'#{test_case} {tree[L]}')