트리 높이의 균형을 유지하는 이진탐색트리
균형인수(BK) = 왼쪽 서브트리의 높이 - 오른쪽 서브트리의 높이
BF 이해를 돕기위한 그림이다. 노드 7은 왼쪽 서브트리의 높이는 3, 오른쪽 서브트리의 높이는 1이므로 BF는 2(= 3-1)가 되고, 노드 6은 왼쪽 서브트리의 높이는 2, 오른쪽 서브트리의 높이는 0으로 BF는 0(= 2-0)이다.
AVL트리는 모든 노드의 BF가 -1, 0, 1 중 하나여야 한다. 이를 벗어난다면 균형이 깨진 것을 의미하며 이때 회전으로 균형을 맞춘다.
AVL 트리에서 삽입/삭제 연산 수행 시 트리의 균형을 유지하기 위해 회전연산 사용
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의 이전 자리로 이동되었으므로
}
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의 이전 자리로 이동되었으므로
}
1) 이진탐색트리의 삽입과 동일하게 새로운 노드 삽입
2) 삽입한 노드루터 루트까지 거슬러가며 각 노드의 서브트리 높이 차이 갱신
3) 불균등한 노드 발견 시 적절한 회전연산 수행
1) 이진탐색트리의 삭제와 동일한 삭제 연산
2) 삭제된 노드로부터 루트까지 거슬러가며 불균형 발생 시 적절한 회전연산 수행
https://www.cs.usfca.edu/~galles/visualization/AVLtree.html