Algorithm/Recursion
[백준] 9934 : 완전 이진 트리 (파이썬)
_은선_
2024. 8. 24. 19:17
728x90
SMALL
트리, 재귀 문제
https://www.acmicpc.net/problem/9934
접근 방식
3
1 6 4 3 5 2 7
주어진 입력과 그래프의 형태를 비교해보면, 그래프를 중위 순회한 결과가 입력 배열로 주어졌다는 사실을 알 수 있다.
따라서, 중위 순회 결과를 기반으로 트리를 재구성한 후, 각 깊이에 위치한 노드들을 출력해주면 된다.
💡 풀이코드 (성공)
import sys
n = int(sys.stdin.readline())
arr = list(map(int, sys.stdin.readline().split()))
graph = [[] for _ in range(n)]
depth = 0
def recursive(start, end, depth):
if start >= end : return
mid = (start + end) // 2
recursive(start, mid, depth + 1)
graph[depth].append(arr[mid])
recursive(mid + 1, end, depth + 1)
recursive(0, 2 ** n - 1, depth)
for i in graph:
print(*i)
트리 순회
이진 트리를 중위 순회(in-order traversal)한 결과에서 트리를 재구성하고, 각 깊이에 있는 노드들을 출력해주었다.
트리의 깊이
현재 트리의 깊이에 해당하는 노드를 graph[depth] 리스트에 추가해준다.
이때, 트리의 깊이는 재귀 호출된 깊이를 활용하여 쉽게 알 수 있다.
트리의 깊이에 해당하는 노드를 graph에 추가해주는 코드를 1), 2), 3) 어느 위치에 두든 상관없다.
그 이유는 이 문제에서 트리 순회한 결과를 출력하는 것이 아닌, 트리의 해당 깊이(depth)에 위치하는 노드들을 순서대로 출력하는 것이 목적이기 때문이다.
recursive(start, mid, depth + 1) # 1)
graph[depth].append(arr[mid]) # 2)
recursive(mid + 1, end, depth + 1) # 3)
728x90
LIST