백준) 9934 완전 이진 트리

박복만·2021년 7월 11일
0

알고리즘_백준

목록 보기
4/7


접근방법

  • 깊이가 k 일때 노드의 개수가 2^k -1 개라는 것을 가지고 포화 이진트리라는 것을 알 수 있다.
  • 이때 중위순회 결과를 봤을때 중간에 있는 값이 루트 노드라는 것을 알 수 있다.
  • 루트 노드를 먼저 찾고 양쪽의 서브트리에서 또다시 루트노드를 찾는 것을 반복해서 레벨별로 저장한다.

코드

n = int(input())

tree = list(map(int, input().split()))
level = [[] for _ in range(n)]

def sol(s, e, depth):
    if s==e:
        level[depth].append(tree[s])
        return
    root = (s+e)//2 # 인덱스의 중간에 있는 값이 루트노드
    level[depth].append(tree[root]) # 레벨을 인덱스로 삼아 그 레벨에 있는 노드들을 더해준다.
    sol(s, root-1, depth + 1) # 왼쪽 하위 서브트리를 다시 순회, 깊이를 늘려주면서 재귀호출
    sol(root+1, e, depth + 1) # 오른쪽 하위 서브트리를 다시 순회, 깊이를 늘려주면서 재귀호출

sol(0,len(tree)-1,0)

for i in level:
    for j in i:
        print(j, end=" ")
    print()

챙겨갈점

  • 중위순회 개념
  • 포화이진트리 개념
  • 레벨 별로 저장하는 테크닉? 매개변수에 1을 늘려주면서 호출하는?
profile
병신

0개의 댓글