주어진 트리를 in-order, 중위 순회해 각 노드를 읽었을 때 나오는 단어를 구하는 문제.

def DFS(i):
if(i > N): # 트리 노드 개수가 끝나면
return
DFS(2*i) # 왼쪽 노드 탐색
print(node[i], end='')
DFS(2*i+1) # 오른쪽 노드 탐색
T = 10 # 테스트케이스의 개수 T
for test_case in range(1, T+1):
N = int(input()) # 노드 개수 N
node = [0 for i in range(N+1)]
# 트리 입력받기
for _ in range(1, N+1):
n, v = input().split()[:2]
node[int(n)] = v
# 탐색 시작
print("\n#%d " %(test_case), end='')
DFS(1)
[문제풀이]

중위 탐색이란 왼쪽 노드부터 시작해서 현재, 오른쪽 노드로 탐색하는 방식이다.
우선 트리를 배열에 저장하는데, 이진 트리는 1차원 배열의 형식으로 저장할 수 있다.
for _ in range(1, N+1):
n, v = input().split()[:2]
node[int(n)] = v
단순히 앞에서부터 차례로 채우는 게 아니라, 부모 노드의 index *2, index *2 +1 자리에 자식 노드가 들어오도록 한다. 주어진 트리는 루트가 1번부터 시작하며, 완전 이진 트리로 왼쪽부터 자식 노드가 꽉 채워진 형식이기 때문에 위치 계산 필요 없이 주어진대로 차례로 채우기만 하면 된다.
DFS(2*i) # 왼쪽 노드 탐색
print(node[i], end='')
DFS(2*i+1) # 오른쪽 노드 탐색
그 다음 탐색을 하는데 이렇게 왼쪽 노드, print문, 오른쪽 노드 순서대로 하면된다.
그럼 DFS로 자식으로 쭉 탐색해 내려간 다음 print문을 실행해 중위 순회가 구현된다.
이 3줄 코드 위치를 조정해 중위, 전위, 후위 탐색이 가능하다.
print문을 맨 위에 둘 시 전위, 중간에 두면 중위, 맨 마지막에 두면 후위 탐색이 된다.
'코딩테스트 > SWEA' 카테고리의 다른 글
| [Python, 파이썬] SWEA 3499. 퍼펙트 셔플 (1) | 2024.11.11 |
|---|---|
| [Python, 파이썬] SWEA 3307. 최장 증가 부분 수열 (1) | 2024.11.11 |
| [Python, 파이썬] SWEA 1219. [S/W 문제해결 기본] 4일차 - 길찾기 (0) | 2024.11.10 |
| [Python, 파이썬] SWEA 3809. 화섭이의 정수 나열 (0) | 2024.11.10 |
| [Python, 파이썬] SWEA 9229. 한빈이와 Spot Mart (0) | 2024.11.10 |