-
[자료구조]CH7. 트리(균형 이진 탐색 트리)자료구조 공부 2021. 3. 23. 19:25
참조 : C로 배우는 쉬운 자료구조 (이지영 저)
공부날짜 : 21.02.20
<Section6> 균형 이진 탐색 트리
1. 균형 이진 탐색 트리의 개념
높이에 대한 균형 조건을 추가하여 정의한 트리를 균형 이진 탐색 트리 또는 균형 트리라고 한다.
대표적인 예가 AVL트리이다.
2. AVL트리의 개념과 유형
각 노드에서 왼쪽 서브 트리의 높이 hL과 오른쪽 서브 트리의 높이 hR의 차이가 1이하인 트리이다.
* 왼쪽 서브 트리 < 부모 노드 < 오른쪽 서브 트리의 크기 관계
* 각 노드의 서브 트리의 높이의 차이(hL-hR)를 노드의 균형 인수(Balance Factor)라 한다.
* 각 노드의 균형 인수는 {-1,0,1}의 값만 가지게 하여 균형을 유지한다.
균형인수가 양수(+)이면 왼쪽 서브 트리에, 음수(-)이면 오른쪽 서브 트리에 문제가 있는 비AVL트리이다.
3. AVL 트리의 회전 연산
1) LL(Left-Left) 회전 연산
LL 유형 : 불균형 발생 노드의 왼쪽 자식 노드와 자식의 왼쪽 자식 노드에 의해 왼쪽으로 치우침
LL 회전 : 문제 구간 중 상위 구간을 오른쪽으로 회전시킴
LL_rotate(parent) {
child=parent->left;
parent->left=child->right; //왼쪽 자식 노드의 오른쪽 자식 노드를 부모 노드의 왼쪽 자식 노드로 옮김
child->right=parent; //부모 노드를 왼쪽 자식 노드의 오른쪽 자식 노드로 옮긴다.
return child;
}
end LL_rotate()
2) RR(Right-Right) 회전 연산
RR 유형 : 불균형 발생 노드의 오른쪽 자식 노드와 자식의 오른쪽 자식 노드에 의해 오른쪽으로 치우침
RR 회전 : 문제 구간 중 상위 구간을 왼쪽으로 회전시킴
RR_rotate(parent) {
child=parent->right;
parent->right=child->left; //오른쪽 자식 노드의 왼쪽 자식 노드를 부모 노드의 오른쪽 자식 노드로 옮김
child->left=parent; //부모 노드를 오른쪽 자식 노드의 왼쪽 자식 노드로 옮긴다.
return child;
}
end LL_rotate()
3) LR 회전 연산
LR 유형 : 불균형 발생 노드의 왼쪽 자식 노드와 자식의 오른쪽 자식 노드에 의해 왼쪽 서브 트리가 치우침
LR 회전 : 문제 구간 중 하위 구간을 왼쪽으로 1차 회전시켜 LL 유형으로 변환한 후 LL회전을 적용함
LR_rotate(parent) {
child=parent->left;
parent->left = RR_rotate(child); //하위 구간에 RR 회전을 하고 반환된 노드를 부모 노드의 왼쪽 자식 노드로 만든다.
return LL_rotate(parent); // 상위 구간에 LL 회전 연산을 한다.
3) RL 회전 연산
RL 유형 : 불균형 발생 노드의 오른쪽 자식 노드와 자식의 왼쪽 자식 노드에 의해 오른쪽 서브 트리가 치우침
RL 회전 : 문제 구간 중 하위 구간을 오른쪽으로 1차 회전시켜 RR 유형으로 변환한 후 RR회전을 적용함
RL_rotate(parent) {
child=parent->right;
parent->right = LL_rotate(child); //하위 구간에 LL회전을 하고 반환된 노드를 부모노드의 오른쪽 자식 노드로 만든다.
return RR_rotate(parent); // 상위 구간에 RR 회전 연산을 한다.
'자료구조 공부' 카테고리의 다른 글
[자료구조] CH8. 그래프(그래프의 구조~그래프의 순회) (0) 2021.03.27 [자료구조]CH7. 트리(히프) (0) 2021.03.23 [자료구조]CH7. 트리(이진 탐색 트리) (0) 2021.03.21 [자료구조]CH7. 트리 (트리의 이해~이진트리의 순회) (0) 2021.03.21 [자료구조]CH6. 큐 (0) 2021.02.09