더북(TheBook)

__remove_recursion 메서드

__remove_recursion() 메서드의 전체 코드를 보고 삭제 노드의 세 가지 경우를 예로 들어 하나씩 살펴보겠습니다.

코드 14-5 bst/BST.py ⑤(__remove_recursion() 메서드)

    def _ _remove_recursion(self, cur, target):
        # 탈출 조건 1
        # 대상 데이터가 트리 안에 없을 때
        if cur = = None:
            return None, None
        # 대상 데이터가 노드 데이터보다 작으면
        # 노드의 왼쪽 자식에서 대상 데이터를 가진 노드를 지운다(재귀 함수 호출)
        elif target < cur.data:
            cur.left, rem_node = self.__remove_recursion(cur.left, target)
        # 대상 데이터가 노드 데이터보다 크면
        # 노드의 오른쪽 자식에서 대상 데이터를 가진 노드를 지운다(재귀 함수 호출)
        elif target > cur.data:
            cur.right, rem_node = self.__remove_recursion(cur.right, target)
        # 탈출 조건 2
        # target = = cur.data
        else:
            #1. 리프 노드일 때
            if not cur.left and not cur.right:
                rem_node = cur
                cur = None
            #2-1. 자식 노드가 하나일 때: 왼쪽 자식이 있을 때
            elif not cur.right:
                rem_node = cur
                cur = cur.left
            #2-2. 자식 노드가 하나일 때: 오른쪽 자식이 있을 때
            elif not cur.left:
                rem_node = cur
                cur = cur.right

            #3. 자식 노드가 두 개일 때
            else:
                #4. 대체 노드를 찾는다
                replace = cur.left
                while replace.right:
                    replace = replace.right
                #5. 삭제 노드와 대체 노드의 값을 교환한다
                cur.data, replace.data = replace.data, cur.data
                #6. 대체 노드를 삭제하면서 삭제된 노드를 받아온다
                cur.left, rem_node = self.__remove_recursion(cur.left, replace.data)
        # 삭제 노드가 루트 노드일 경우
        # 루트가 변경될 수 있기 때문에
        # 삭제 후 현재 루트를 반환
        return cur, rem_node


탈출 조건은 대상 데이터가 트리 안에 없거나 대상 데이터를 찾았을 때입니다(#탈출 조건 1, 2). 또한 세 가지 경우의 삭제 조건도 보입니다. 각각 리프 노드일 때(#1), 자식 노드가 하나일 때(#2-1. #2-2), 자식 노드가 두 개일 때(#3)의 코드입니다.

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