[c++] 레드-블랙 트리의 삭제(Red-Black Tree Deletion)

레드-블랙 트리에서 노드를 삭제하는 과정은 까다로운데, 레드-블랙 트리의 속성을 만족시키기 위해 균형을 맞춰야 합니다. 레드-블랙 트리의 삭제 알고리즘은 여러 경우의 수를 고려해야 하며, 이는 다른 이진 검색 트리들보다 더 복잡합니다.

레드-블랙 트리의 삭제 알고리즘

레드-블랙 트리에서 노드를 삭제할 때는 일반적으로 다음과 같은 단계를 따릅니다.

  1. 이진 검색 트리의 노드 삭제처럼 삭제 대상 노드를 식별하고, 해당 노드를 삭제합니다.
  2. 삭제된 노드의 자식 노드의 수에 따라 다른 조치를 취합니다.
  3. 삭제된 노드의 자리를 대체할 적절한 노드를 찾아야 합니다.
  4. 삭제된 노드의 대체 노드를 조율하여 레드-블랙 트리의 속성을 유지합니다.

C++ 레드-블랙 트리 삭제의 예시

다음은 C++로 구현된 레드-블랙 트리의 삭제 알고리즘의 간단한 예제입니다.

void RBTree::deleteNode(Node* v) {
    // 삭제될 노드의 조상
    Node* u = getBSTReplace(v);

    // v를 u로 대체하여 삭제
    bool uvBlack = ((u == NULL || u->color == BLACK) && (v->color == BLACK));
    Node* parent = v->parent;
    if (u == NULL) {
        // u가 NULL인 경우
        if (v == root) {
            // 삭제될 노드가 루트 노드인 경우
            root = NULL;
        } else {
            if (uvBlack) {
                // 삭제된 노드와 대체된 노드가 동시에 블랙인 경우
                fixDoubleBlack(v);
            } else {
                if (v->sibling() != NULL) {
                    // 삭제된 노드에 형제 노드가 있는 경우
                    v->sibling()->color = RED;
                }
            }

            // 삭제될 노드 삭제
            if (v->isOnLeft()) {
                parent->left = NULL;
            } else {
                parent->right = NULL;
            }
        }
        delete v;
        return;
    }

    if (v->left == NULL || v->right == NULL) {
        // 삭제될 노드의 자식 노드가 하나 뿐인 경우
        if (v == root) {
            // 삭제될 노드가 루트 노드인 경우
            v->data = u->data;
            v->left = v->right = NULL;
            delete u;
        } else {
            if (v->isOnLeft()) {
                parent->left = u;
            } else {
                parent->right = u;
            }
            delete v;
            u->parent = parent;
            if (uvBlack) {
                // 삭제된 노드와 대체된 노드가 동시에 블랙인 경우
                fixDoubleBlack(u);
            } else {
                // 대체된 노드를 블랙으로 만듦
                u->color = BLACK;
            }
        }
        return;
    }

    // 삭제될 노드의 자식 노드가 둘 다 있는 경우
    swapValues(u, v);
    deleteNode(u);
}

이 코드는 레드-블랙 트리에서 노드를 삭제하는 알고리즘을 구현한 것입니다.

마무리

레드-블랙 트리에서 노드를 삭제하는 과정은 다른 이진 검색 트리들보다 더 복잡합니다. 따라서 정확한 알고리즘을 통해 레드-블랙 트리의 속성을 유지하면서 노드를 삭제해야 합니다. C++을 사용하여 레드-블랙 트리의 삭제 알고리즘을 구현하는 방법에 대해 알아보았습니다.

참고 문헌: GeeksforGeeks - Red Black Tree (Delete)