너와!나의!알고!리즘!/SWEA
[SWEA #1231, Python ] 중위순회
moongchi98
2021. 4. 5. 23:32
[풀이]
🐤 내 원래 풀이
def in_order(n):
global result
if n > 0: #돌아오는 조건
in_order(left[n])
result += word[n]
in_order(right[n])
for tc in range(1,11):
result = ""
V = int(input())
left = [0]*(V+1)
right = [0] *(V+1)
parent = [0] *(V+1)
word = [0] *(V+1)
for _ in range(V):
tmp = list(map(str,input().split()))
word[int(tmp[0])] = tmp[1] #단어 저장하기
if len(tmp) == 3:
left[int(tmp[0])] = int(tmp[2])
parent[int(tmp[2])] = int(tmp[0])
elif len(tmp) == 4:
left[int(tmp[0])] = int(tmp[2])
parent[int(tmp[2])] = int(tmp[0])
right[int(tmp[0])] = int(tmp[3])
parent[int(tmp[3])] = int(tmp[0])
in_order(1)
print(f'#{tc} {result}')
나는 left, right를 만들어서 각각의 값들을 저장해주고, 그다음 중위순회로 조회하였다. 그런데 다른분들 풀이를 보니까 내 코드 길이의 1/2인거 아닌가...! 이게 머선 129,, 해서 확인해봤는데 이건 완전이진트리의 특성을 사용하면 짧게 풀 수 있는 것이였다!!!
🐔 완전 이진트리라는 정의 활용
완전 이진트리는 노드가 n개있으면, 비어있지 않고 1~n 자리에 모두 노드가 존재하는 것! 그렇다 보니까 자연스럽게 부모의 왼쪽 subtree의 node는 부모 node가 n번이라고 할때, 왼쪽 n*2, 오른쪽 2*n+1 임을 활용해서 코드를 확 줄일 수 있다. 따로 저장하지 않고, slicing으로 그 node에 저장되는 값만을 저장하고 => 순회하면 되는것!
def in_order(n):
global result
if 0<n<=V:
if visit[n] == False:
in_order(n*2)
visit[n] = True
result += tree[n]
in_order(n*2+1)
#완전 이진트리이면 이방법가능!!!! => 그리고 값이 주어져도 문제 x
for tc in range(1,11):
V = int(input())
result = ""
tree = [0]#반드시 하나가 들어있어야 에러 발생 x
visit=[False]*(V+1)
for _ in range(V):
tree.append(input().split()[1]) #해당 정점의 저장되는 값만 tree에 저장하기
in_order(1)
print(f'#{tc} {result}')