AVL트리란 스스로 균형을 잡아주는 트리이다.
AVL트리는 BST의 일종으로 트리의 h에 따라 수행시간이 결정되는 BST특성에서 O(n)이 되지 않도록 잡아주는 역할을 한다.
이를 위해서 중요한 조건을 만족한다.
AVL트리의 높이
예시로 h가 3일 때 최소 인터널 노드의 개수 n(3)을 구해보자.
이 페이지를 이해하기 위해 다음 증명식을 참고하자.
z = 균형이 맞지 않는 레벨의 internal 노드 (insert와 removal의 결과로 예측한 결과이기에 틀릴 수도 있다.)
y = z의 자식 중 height가 높은 것
x = y의 자식 중 height가 높은 것
abc 순서 -> inorder 순서
위 그림은 54를 삽입한 예시이다.
먼저 이진탐색트리의 규칙을 통해 숫자를 삽입한다.
하지만 레벨1과 레벨2에서 AVL트리의 height규칙을 위반한 것을 알 수 있다.
아래서부터 시작해서 처음 균형이 어긋난 노도의 parent를 z, 그 후로 순서를 메긴다.
또한 inorder에 맞게 a~ 순서를 메긴다.
아래 그림처럼 restructuring
이때 서브트리가
하나만 이동하는 것을 -> single rotation
두개가 이동하는 것을 -> double rotation 이라 함.
결과적으로 AVL트리의 삽입 = 이진탐색트리 + restructuring 이다.
1) binary search tree 와 동일한 방법으로 삽입 ⇒ O(log n)
2) 삽입한 곳으로부터 올라가며 문제가 발생하는지 확인 ⇒ O(log n)
3) z,y,x 크기 비교, a,b,c 설정 ⇒ O(1)
4) 서브트리 T1 or T1, T2 옮기기 ⇒ O(1)
의 과정을 거치므로 총 수행시간은 "O(log n)" 이 된다.
removal 과정도 삽입과정과 유사한 알고리즘이므로 참고 사진만을 첨부하겠다.
find - O(log n)
insert - O(log n)` 시간이 걸린다.
erase - O(log n)
⇒ AVL 트리는 모든 연산시간이 O(log n) 시간이 걸린다.