[c++] AVL 트리의 균형 유지(Balancing AVL Tree)

AVL 트리는 이진 탐색 트리로, 삽입 또는 삭제 연산으로 인해 트리의 불균형이 발생할 수 있습니다. 따라서 AVL 트리를 유지하기 위해서는 균형을 유지해야 합니다. 이를 위해 AVL 트리는 각 노드의 높이 차이가 1을 초과하지 않도록 균형을 유지합니다.

AVL 트리의 균형 조정

AVL 트리의 균형을 조정하기 위해 회전 연산을 사용합니다. 회전 연산은 LL, RR, LR, RL 네 종류가 있으며, 각각의 경우에 따라 트리의 균형을 조정합니다.

LL 회전

LL 회전은 우로 한 번 회전하는 연산입니다. 왼쪽 서브트리의 왼쪽 자식 노드에 새로운 노드가 삽입될 때 발생합니다. 이 때, 오른쪽으로 한 번 회전하여 균형을 유지합니다.

RR 회전

RR 회전은 좌로 한 번 회전하는 연산입니다. 오른쪽 서브트리의 오른쪽 자식 노드에 새로운 노드가 삽입될 때 발생합니다. 이 때, 왼쪽으로 한 번 회전하여 균형을 유지합니다.

LR 회전

LR 회전은 왼쪽 서브트리에서 오른쪽 자식 노드에 새로운 노드가 삽입될 때 발생합니다. 먼저 좌로 한 번 회전하고, 그 다음에 우로 한 번 회전하여 균형을 유지합니다.

RL 회전

RL 회전은 오른쪽 서브트리에서 왼쪽 자식 노드에 새로운 노드가 삽입될 때 발생합니다. 먼저 우로 한 번 회전하고, 그 다음에 좌로 한 번 회전하여 균형을 유지합니다.

코드 예제

다음은 C++로 작성된 AVL 트리의 균형을 유지하는 코드 예제입니다.

// AVL 트리의 균형을 조정하는 함수
void balance(Node* &root) {
    if (calculateBalanceFactor(root) > 1) {
        if (calculateBalanceFactor(root->left) > 0) {
            // LL 회전
            rightRotation(root);
        } else {
            // LR 회전
            leftRotation(root->left);
            rightRotation(root);
        }
    } else if (calculateBalanceFactor(root) < -1) {
        if (calculateBalanceFactor(root->right) < 0) {
            // RR 회전
            leftRotation(root);
        } else {
            // RL 회전
            rightRotation(root->right);
            leftRotation(root);
        }
    }
}

참고 자료

AVL 트리의 균형 유지는 트리의 높이를 최소로 유지하여 탐색과 삽입, 삭제 연산의 효율성을 극대화하는데 중요한 역할을 합니다. 회전 연산을 통해 트리의 균형을 유지하는 것이 핵심이며, 이를 효율적으로 구현하는 것이 중요합니다.