본문 바로가기
Study/Data Structure

[자료 구조] 2. 트리(Tree) - 이진 탐색 트리(Binary Search Tree), 균형 이진 탐색 트리(Balanced Binary Search Tree, AVL 트리)

by coMGod98 2021. 7. 1.

트리란?

 

[자료구조] 1. 트리(Tree) - 이진 트리(Binary Tree), 트리 순회(Tree Traverse)

선형 리스트란? [자료구조] 선형 리스트 (Linear List) ● 선형 리스트 (Linear List) - 데이터를 논리적인 순서대로 메모리에 연속하여 저장하는 구현하는 방식 - 데이터의 논리적인 순서와 기억 장소에

toward-the-future.tistory.com

 

● 이진 탐색 트리 (Binary Search Tree)

- 이진 트리를 탐색용 자료구조로 사용하기 위해 원소 크기에 따라 노드 위치를 정의한 것이다.

- 중위 순회를 통해 원소의 키 값을 오름차순으로 얻을 수 있다.

○ 조건

- 모든 원소는 서로 다른 유일한 키를 갖는다.

- 모든 왼쪽 자식들은 부모보다 키 값이 작아야한다.

- 모든 오른쪽 자식들은 부모도 키 값이 커야한다.

 

○ 탐색 연산

- 탐색할 키 값이 현재 탐색하는 노드의 키 값보다 크면 오른쪽 서브트리로 이동

- 탐색할 키 값이 현재 탐색하는 노드의 키 값보다 작으면 왼쪽 서브트리로 이동

- 탐색할 키 값이 현재 탐색하는 노드의 키 값과 같으면 탐색 성공

 

○ 삽입 연산

 삽입할 원소의 키 값이 트리 안에 같은 키 값이 있는지 탐색하여 확인한다.

 탐색에서 실패하면 그 탐색을 실패한 위치에 원소를 삽입한다.

 

○ 삭제 연산_삭제할 노드가 단말 노드인 경우

 삭제할 노드를 탐색한다.

 노드를 삭제한다.

 

○ 삭제 연산_삭제할 노드가 자식 노드를 한 개 가진 경우

 삭제할 노드를 탐색한다.

 노드를 삭제한다.

 노드를 삭제하면, 자식 노드는 트리에서 연결이 끊어져서 고아가 된다.

 삭제한 부모 노드의 자리를 자식 노드에게 물려준다.

 

○ 삭제 연산_삭제할 노드가 자식 노드 두 개 가진 경우

 삭제할 노드를 탐색한다.

 노드를 삭제한다.

 노드를 삭제하면, 자식 노드들은 트리에서 연결이 끊어져서 고아가 된다.

 삭제한 노드의 자리를 자손 노드들 중에서 선택한 후계자에게 물려준다.

# 후계자를 선택하는 방법은 삭제한 노드의 왼쪽 서브트리에서 키 값이 가장 큰 자손 노드를 선택하는 방법과 오른쪽 서브 트리에서 키 값이 가장 작은 자손 노드를 선택하는 방법이 있다.

왼쪽 서브 트리에서 후계자 선택

 

오른쪽 서브 트리에서 후계자 선택

 

○ 이진 탐색 트리의 문제점

- 부모의 노드보다 오름차순 혹은 내림차순으로 데이터가 삽입될 경우 트리의 높이가 커진다.

 

● 균형 이진 탐색 트리 (Balanced Binary Search Tree)

- 이진 탐색 트리의 문제점을 보완하고자 나온 것이 균형 이진 탐색 트리이다.

- 높이를 \(O(log(n))\)으로 제한하여 고안된 것이다.

○ 종류

이진의 균형 검색 트리 AVL 트리
Red-Black 트리
이진이 아닌 균형 검색 트리 2-3 트리
2-3-4 트리
B 트리

 

● AVL 트리

- 노드가 삽입&삭제될 때 트리의 균형 상태를 파악해서 스스로 그 구조를 변경하여 균형을 유지하는 트리이다.

- 각 노드의 BF는 {-1, 0, 1} 값만 가지게 함으로써 왼쪽 서브 트리와 오른쪽 서브 트리의 균형을 항상 유지한다.

○ BF(Balace Factor, 균형 인수)

- 균형의 정도를 표현하기 위해서 사용한다.

- BF = 왼쪽 서브 트리의 높이 - 오른쪽 서브 트리 높이

- 즉, 각 노드의 왼쪽 서브 트리 높이와 오른쪽 서브 트리 높이의 차이

- 단말 노드는 서브 트리가 없으므로 BF는 0이다.

 

○ 균형을 맞춰주는 재구성 작업(Rebalancing, 리밸런싱)

- 균형이 깨진 노드의 BF ' + ' 이면 왼쪽 서브 트리에 문제가 있는 것이다.

- 균형이 깨진 노드의 BF ' - ' 이면 오른쪽 서브 트리에 문제가 있는 것이다.

- AVL트리는 삽입&삭제 후에 BF를 확인하여 '회전 연산'을 한다.

회전 유형 원인 해결 방법
단순 회전
(한 번 회전)
LL 유형 불균형 발생 노드의 왼쪽 자식 노드와  자식의 왼쪽 자식 노드에 의해 왼쪽으로 쏠려있다. LL 회전
RR 유형 불균형 발생 노드의 오른쪽 자식 노드와 자식의 오른쪽 자식 노드에 의해 오른쪽으로 쏠려있다. RR 회전
이중 회전
(두 번 회전)
LR 유형 불균형 발생 노드의 왼쪽 자식 노드와 자식의 오른쪽 자식 노드에 의해 왼쪽 서브 트리가 쏠려있다. LR 회전
RL 유형 불균형 발생 노드의 오른쪽 자식 노드와 자식의 왼쪽 자식 노드에 의해 오른쪽 서브 트리가 쏠려있다. RL 회전

○ LL 회전

- 문제 구간 중 상위 구간을 오른쪽(시계 방향)으로 회전 시킨다.

 

○ RR 회전

- 문제 구간 중 상위 구간을 왼쪽(반시계 방향)으로 회전 시킨다.

 

○ LR 회전

- 문제 구간 중 하위 구간을 1차로 RR 회전을 시켜서 LL유형으로 변환한 다음 LL회전을 적용한다.

 

○ RL 회전

- 문제 구간 중 하위 구간을 1차로 LL 회전을 시켜서 RR유형으로 변환한 다음 RR회전을 적용한다.

 

댓글