Algorithm/APS

[APS] 8. 트리 (Tree)와 힙 (Heap)

개발자 뭄뭄 2022. 9. 21. 00:00
반응형

1. 완전 이진트리 (Complete Binary Tree)

높이가 h이고, 노드 수가 n개 일 때, 포화 이진트리의 노드 번호 1번부터 n번까지 빈자리가 없는 트리

2. 이진 탐색 트리

  • 왼쪽 서브트리 < key (루트노드) < 오른쪽 서브트리
  • 왼쪽 서브트리와 오른쪽 서브트리도 이진 탐색 트리다.
  • ‘중위 순회’ 하면 오름차순으로 정렬된 값을 얻을 수 있다.
    def binary(node):
        global k
        # 왼쪽이 비어있으면 왼쪽으로 이동
        if 2*node <=n and nodes[2*node] == 0:
            binary(2*node)
        # 자기 자신을 채우고
        nodes[node] = k
        k = k+1
        # 오른쪽으로 이동한다.
        if 2*node+1 <=n and nodes[2*node + 1] == 0:
            binary(2*node+ 1)
    
    T = int(input())
    for tc in range(1, T+1):
        k = 1
        n = int(input())
        # 이진 탐색 트리는 중위 순회의 역순으로 넣으면 된다.
        nodes = [0 for _ in range(n+1)]
        binary(1)
        print(f"#{tc} {nodes[1]} {nodes[n//2]}")

3. 힙(heap)

  • 최대 힙(max heap)
    • 키 값이 가장 큰 노드를 찾기 위한 완전 이진 트리
    • 부모 노드의 키 값 > 자식 노드의 키 값
    • 루트 노드 : 키 값이 가장 큰 노드
  • 최소 힙(min heap)
    • 키 값이 가장 작은 노드를 찾기 위한 완전 이진 트리
    • 부모 노드의 키 값 < 자식 노드의 키 값
    • 루트 노드 : 키 값이 가장 작은 노드
  • 힙 연산에서의 삽입(enque)
    # index 번호(last)를 하나 추가한다.
    # heap[last] = n
    # 이후에 부모와 비교해서 자리를 재배치 한다.
    # 자식 = 들어온 노드
    # 부모 = 자식 //2
    
    # 부모가 존재하고, 자식이 부모보다 크다면 (while)
    	# 자리를 변경한다.
    	# 또 다시 변경해야 할 수 있으므로, p,c를 갱신한다.
  • 힙 연산에서의 삭제(deque) → 루트 노드만 삭제할 수 있다.
    # 현재의 1번값을 저장해 둔다.
    # 루트 노드에 맨 마지막(last)의 값을 옮기고,
    # last를 삭제한다.
    
    # 부모 = 1, 자식 = 부모 //2
    # 자식이 있는 경우, 비교를 시작한다. (while)
    	# 오른쪽 자식도 있고, 왼쪽 자식 < 오른쪽 자식이면 비교대상을 오른쪽으로 한다.
    	# 자식 > 부모이면,
    		# 자리를 변경하고 갱신한다.
    	# 그렇지 않다면, 반복문을 중단한다.

Uploaded by N2T

반응형