[자료구조] AVL 트리의 개념과 회전연산

아는벌·2023년 2월 28일
0

자료구조

목록 보기
8/8
post-thumbnail

AVL 트리

트리 높이의 균형을 유지하는 이진탐색트리

  • 임의의 노드 x에 대해 x의 왼쪽 서브트리의 높이와 오른쪽 서브트리의 높이 차이가 1을 넘지 않는 이진탐색트리
  • 트리가 한 쪽으로 치우쳐 자라나는 현상을 방지
  • 삽입/삭제로 인해 균형이 깨지면 회전 연산을 통해 트리의 균형을 유지
  • 균형 이진트리를 만들면 트리의 높이는 O(logN) -> 탐색, 삽입, 삭제 연산의 수행시간 O(logN) 보장

균형인수(BK; Balance Factor)

균형인수(BK) = 왼쪽 서브트리의 높이 - 오른쪽 서브트리의 높이


BF 이해를 돕기위한 그림이다. 노드 7은 왼쪽 서브트리의 높이는 3, 오른쪽 서브트리의 높이는 1이므로 BF는 2(= 3-1)가 되고, 노드 6은 왼쪽 서브트리의 높이는 2, 오른쪽 서브트리의 높이는 0으로 BF는 0(= 2-0)이다.


AVL트리는 모든 노드의 BF가 -1, 0, 1 중 하나여야 한다. 이를 벗어난다면 균형이 깨진 것을 의미하며 이때 회전으로 균형을 맞춘다.

AVL트리의 회전연산

AVL 트리에서 삽입/삭제 연산 수행 시 트리의 균형을 유지하기 위해 회전연산 사용

rotateRight

  • 왼쪽 방향의 서브트리가 높아서 불균형이 발생할 때 서브트리를 오른쪽 방향으로 회전하기 위한 메소드
private Node rotateRight(Node n) {
	Node x = n.left;
    n.left = x.right;
    x.right = n;
    n.height = tallerHeight(height(n.left), height(n.right))+1; // 높이갱신
    x.height = tallerHeight(height(x.left), height(x.right))+1; // 높이갱신 
    return x;	// 회전 후 x가 n의 이전 자리로 이동되었으므로
}
  • 노드의 왼쪽 자식노드 x(n.left)를 노드 n의 자리로 옮기고,
  • 노드 n을 노드 x의 오른쪽 자식노드로(x.right) 만든다.

rotateLeft

  • 오른쪽 방향의 서브트리가 높아서 불균형이 발생할 때 서브트리를 왼쪽 방향으로 회전하기 위한 메소드
private Node rotateLeft(Node n) {
	Node x = n.right;
    n.right = x.left;
    x.left = n;
    n.height = tallerHeight(height(n.left), height(n.right))+1; // 높이갱신
    x.height = tallerHeight(height(x.left), height(x.right))+1; // 높이갱신 
    return x;	// 회전 후 x가 n의 이전 자리로 이동되었으므로
}
  • 노드 n의 오른쪽 자식노드 x(n.right)를 노드 n의 자리로 옮기고,
  • 노드 n을 노드의 x의 왼쪽 자식(x.left)로 만든다.

LL-회전

  • 노드 8의 왼쪽 서브트리의 높이와 오른쪽 서브트리의 높이 차이 = 2
  • BF가 -1~1을 벗어난 노드를 기준으로 왼쪽, 왼쪽 노드가 존재한다면 LL Case
  • roetateRight() 메소드 사용

RR-회전

  • 노드 3의 왼쪽과 오픈쪽 서브트리의 높이 차이 = -2
  • BF가 -1~1을 벗어난 노드를 기준으로 오른쪽, 오른쪽 노드가 존재한다면 RR Case
  • rotateLeft() 메소드 사용

LR-회전

  • BF가 -1~1을 벗어난 노드를 기준으로 왼쪽, 오른쪽 노드가 존재한다면 LR Case
  • 노드 9의 왼쪽 자식노드(노드 5)를 기준으로 rotateLeft(5)를 먼저 수행한 후 노드 8을 기준으로 rotateRight(9)을 수행하여 불균형 해소

RL-회전

  • BF가 -1~1을 벗어난 노드를 기준으로 오른쪽, 왼쪽 노드가 존재한다면 RL Case
  • 노드 5의 오른쪽 자식노드(노드 10)를 기준으로 rotateRight(10)를 먼저 수행한 후 노드 8을 기준으로 rotateLeft(5)을 수행하여 불균형 해소

회전연산의 공통점

  • 회전 후의 트리들이 모두 동일
  • 각 회전연산의 수행시간 - O(1)

삽입연산

1) 이진탐색트리의 삽입과 동일하게 새로운 노드 삽입
2) 삽입한 노드루터 루트까지 거슬러가며 각 노드의 서브트리 높이 차이 갱신
3) 불균등한 노드 발견 시 적절한 회전연산 수행

삭제연산

1) 이진탐색트리의 삭제와 동일한 삭제 연산
2) 삭제된 노드로부터 루트까지 거슬러가며 불균형 발생 시 적절한 회전연산 수행

AVL 트리 시뮬레이터

https://www.cs.usfca.edu/~galles/visualization/AVLtree.html

참고

https://code-lab1.tistory.com/61

0개의 댓글