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