더북(TheBook)

  8. 이제 원소 삭제가 구현되어 있는 함수를 살펴보겠습니다. 특정 노드를 삭제하면, 해당 노드의 부모 노드 포인터를 조정해야 합니다. 그래서 삭제 구현 함수는 부모 노드 포인터가 새로 가리켜야 할 노드의 주소를 반환하도록 설정했습니다. 함수 이름을 deleteValue()로 설정한 것은 delete는 C++ 표준에 정의되어 있는 키워드이기 때문입니다.

    void deleteValue(int value)
    {
         root = delete_impl(root, value);
    }
    
private:
    node* delete_impl(node* start, int value)
    {
        if (!start)
            return NULL;
            
        if (value < start->data)
            start->left = delete_impl(start->left, value);
        else if (value > start->data)
            start->right = delete_impl(start->right, value);
        else
        {
            if (!start->left) // 자식 노드가 전혀 없거나, 왼쪽 자식 노드만 없는 경우
            {
                auto tmp = start->right;
                delete start;
                return tmp;
            }
            
            if (!start->right) // 오른쪽 자식 노드만 없는 경우
            {
                auto tmp = start->left;
                delete start;
                return tmp;
            }
            
            // 자식 노드가 둘 다 있는 경우
            auto succNode = successor(start);
            start->data = succNode->data;
            
            // 오른쪽 서브 트리에서 후속(successor)을 찾아 삭제
            start->right = delete_impl(start->right, succNode->data)
        }
        
        return start;
    }
};
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.