__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)의 코드입니다.

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