더북(TheBook)

코드 11-4

    def pop(self):
        if self.is_empty():
            return None
        
        rem_elem = self.arr[1] 
       temp = self.arr[self.heapsize]
       self.heapsize -= 1
        cur_idx = 1 
        child = self.left(cur_idx) 

        while child <= self.heapsize: 
            if child < self.heapsize and \
                self.arr[self.left(cur_idx)].key <
                self.arr[self.right(cur_idx)].key:
                child = self.right(cur_idx)
            if temp.key >= self.arr[child].key:
                break
           self.arr[cur_idx] = self.arr[child]
           cur_idx = child
            child = self.left(cur_idx)

        self.arr[cur_idx] = temp

        return rem_elem

삭제된 후 반환될 원소

맨 마지막에 위치한 원소를 받아 온 후 힙 사이즈를 줄이면 완전 이진 트리 특성을 유지할 수 있습니다.

루트에서 시작

루트의 왼쪽 자식

child > heapsize면 arr[cur_idx]는 리프 노드입니다.

오른쪽 자식이 있고 오른쪽 자식의 키가 왼쪽 자식의 키보다 크면 child를 오른쪽 자식으로

최대 힙 특성을 만족하면 반복문을 나옵니다.

키가 큰 자식 원소를 부모로 이동시킵니다. cur_idx는 자식 원소로 이동합니다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.