AVL
AVL 트리는 Balanced Binary Search Tree이다. AVL 트리는 각각 노드마다 왼쪽, 오른족 서브트리의 높이 차이에 대한 정보를가지고 서브트리의 높이 차이가 1보다 크지않다는 성질을 가진다.(위키피디아 )
즉, 양쪽 서브트리의 높이 차이가 1이하이다.
균형잡힌 AVL 트리는 n개의 원소가 있을 때 O(logn)의 시간복잡도로 검색, 삽입, 삭제를 할 수 있다.
시간 복잡도
평균
최악의 경우
공간
O(n)
O(n)
검색
O(logn)
O(logn)
삽입
O(logn)
O(logn)
삭제
O(logn)
O(logn)
Rotation
트리의 재구성 작업을 Rotation(회전)이라고 한다.
LL
z y
/ \ / \
y T4 Right Rotate (z) x z
/ \ - - - - - - - - -> / \ / \
x T3 T1 T2 T3 T4
/ \
T1 T2y는 z의 왼쪽 자식, x는 y의 왼쪽 자식이다. 이때 T1, T2, T3, T4는 각각의 서브트리이다.
z의 오른족 자식과 왼쪽 자식이 불균형하므로 right Rotation 한번으로 균형을 잡아줄 수 있다.
LR
y는 z의 왼쪽 자식, x는 y의 오른쪽 자식이다. 이러한 경우에는 회전을 두번시켜줘야한다. 우선 y를 왼쪽 회전을 한번 시켜주고 z를 오른쪽 회전시켜주면 균형이 잡히게 된다.
RR
y는 z의 오른쪽 자식이고, x는 y의 오른쪽 자식이다. 이러한 경우는 LL과 마찬가지로 한번의 rotation으로 균형을 잡을 수 있다.
RL
y는 z의 오른쪽자식, x는 y의 왼쪽 자식이다 .이러한 경우는 위의 LR과 정 반대인 경우이다. 이 때는 오른쪽 회전 후 왼쪽 회전을 하면 균형을 맞출 수 있다.
구현
height
Right Rotation
Left Rotation
balance
삽입
위의 Rotation을 이용해서 삽입을 구현할 수 있다.
우선 BST의 삽입과 같이 삽입한다.
현재의 height값을 update해준다.
balance한지 확인한다.(-1미만 1초과 불균형)
불균형하다면 LL, LR, RR, RL 의 각각의 경우에 맞게 rotation해준다.
삭제
우선 BST의 삭제와 같이 삭제하다.
현재 노드는 반드시 삭제노드의 조상노드 중 하나여야한다.
현재의 height값을 update해준다.
balance한지 확인한다.(-1미만 1초과 불균형)
불균형하다면 LL, LR, RR, RL 의 각각의 경우에 맞게 rotation해준다.
Last updated
Was this helpful?