AVL 트리와 레드-블랙 트리
직관 → 조작 → 예시 → 함정 → 답안
AVL tree와 red-black tree는 plain BST가 한 줄짜리 chain으로 망가지는 문제를 막는 balanced search tree입니다. 둘 다 먼저 BST order invariant를 만족해야 하고, 그 위에 height를 작게 유지하는 balance invariant를 추가합니다. AVL은...
균형 인수(balance factor): BF(v)=height(left(v))-height(right(v))\(\text{AVL} 조건: \text{BF}(v) \in \{-1,0,1\}\)AVL 조건: BF(v) ∈ {-1,0,1}회전(rotation): 중위 순서를 보존하는 국소 구조 변경LL, RR, LR, RL: AVL 복구의 네 경우도입: 왜 이진 탐색 트리(BST)만으로는 부족한가
Binary Search Tree(BST)는 key를 비교할 때마다 왼쪽 또는 오른쪽 subtree 하나를 통째로 버릴 수 있어서 빠릅니다. 문제는 tree가 균형을 잃으면 이 장점이 사라진다는 점입니다. 1, 2, 3, 4, 5를 순서대로 넣은 plain BST를 떠올리면 모든 node가 오른쪽으로만 이어진 chain이 됩니다. 이때 search, insert, delete는 tree height h에 비례하므로 \(\Theta(h)\)Θ(h)=\(\Theta(n)\)Θ(n)까지 느려집니다.
AVL tree(AVL-Baum)와 red-black tree(Rot-Schwarz-Baum)의 공통 목표는 “BST order는 유지하고, height는 \(O(\log n)\)O(log n)으로 묶는다”입니다.
먼저 알아야 할 개념
- BST invariant: 왼쪽 subtree key는 작고, 오른쪽 subtree key는 큽니다. duplicate rule은 문제 convention을 따릅니다.
- height(Höhe): node에서 가장 깊은 leaf까지 내려가는 edge 수입니다. Lecture 04 AVL에서는 \(\text{height}(\text{empty})=-1\)
height(empty)=-1을 사용합니다. - inorder traversal: BST에서는 sorted order를 줍니다.
- rotation(Rotation/Drehung): parent-child pointer 몇 개만 바꾸는 \(\Theta(1)\)
Θ(1)local operation입니다.
핵심 수식과 기호
일반 BST(plain BST)
T(search) = T(insert) = T(delete) = Θ(h)h는 트리 높이(tree height)입니다. 일반 BST는 \(h=O(\log n)\)h=O(log n)을 자동으로 보장하지 않습니다.
AVL 균형 인수(balance factor)
B(x)=height(x.right)-height(x.left) ∈ {-1,0,+1}Lecture 04의 부호 규칙(convention)입니다. 다른 책은 부호를 반대로 둘 수 있으므로 답안에서 규칙을 먼저 말하세요.
AVL 높이(height)
N(h)=1+N(h-1)+N(h-2), h ≤ 1.441 log₂ n가장 마른 AVL도 피보나치(Fibonacci) 수열처럼 노드 수가 늘어나므로 높이는 로그 수준(logarithmic)입니다.
회전(rotation)
A < x < B < y < C (회전 전후 동일)회전은 중위 순서(inorder order)를 보존합니다.
검정 높이(black height)
검정 높이(Schwarzhöhe)는 경로에서 검정 노드만 세는 값입니다.
레드-블랙 높이(red-black height)
h ≤ 2 log₂(n+1)빨강-빨강(red-red) 금지와 동일한 검정 높이(equal black-height) 때문에 높이가 \(O(\log n)\)O(log n)입니다.
Sheet06 포함 관계
모든 AVL 모양(shape)은 레드-블랙 색칠이 가능하고, 모든 레드-블랙 트리는 BST입니다. 역은 일반적으로 거짓입니다.
단계별 개념 설명
1. height가 runtime이다
BST search는 root에서 시작해 한쪽 subtree만 따라갑니다. 그래서 비교 횟수는 path 길이, 즉 height h에 비례합니다.
2. rotation은 안전한 수리다
rotation은 tree shape만 바꾸고 inorder ribbon을 유지합니다. 따라서 BST invariant를 깨지 않고 local height를 줄일 수 있습니다.
3. AVL은 저울 방식이다
모든 node에서 오른쪽 높이와 왼쪽 높이 차이 B(x)가 -1, 0, +1이어야 합니다. +2 또는 -2가 나오면 rotation case를 찾습니다.
4. red-black은 checkpoint 방식이다
모든 path가 같은 수의 black checkpoint를 지나야 하고, red checkpoint는 연속될 수 없습니다. 그래서 한 path만 너무 길어질 수 없습니다.
5. 시험은 판정과 비교를 묻는다
Sheet06은 valid RB/AVL 판정, insertion/deletion repair, AVL ⊂ RB ⊂ BST, 그리고 AVL/RB tradeoff를 묻습니다.
그림처럼 떠올리는 구조
세 그림으로 기억하세요. 첫째, BST order는 바닥 레일입니다. 모든 repair는 이 레일을 벗어나면 안 됩니다. 둘째, AVL은 각 node에 작은 저울을 달아 왼쪽/오른쪽 subtree 높이 차이를 재는 그림입니다. 셋째, red-black tree는 root에서 NIL leaf까지 가는 모든 길에 같은 수의 black checkpoint가 놓인 그림입니다.
한쪽으로 치우친 BST(skewed BST)
\(1 \to 2 \to 3 \to 4 \to 5\)1 → 2 → 3 → 4 → 5처럼 한쪽 사슬(chain)이 되면 \(h=\Theta(n)\)h=Θ(n)입니다.
AVL 복구(repair)
무거운 경로가 왼쪽-왼쪽(LL), 오른쪽-오른쪽(RR), 왼쪽-오른쪽(LR), 오른쪽-왼쪽(RL)인지 보고 회전을 고릅니다.
레드-블랙 복구(RB repair)
빨강-빨강 위반(red-red violation)인지, 검정 높이 부족(black-height deficit)인지 먼저 구분합니다.
풀이 예제: AVL의 RR 경우
- 빈 AVL tree에 10을 넣으면 10이 root입니다.
- 20은 10보다 크므로 10의 right child입니다.
- 30은 10보다 크고 20보다 크므로 20의 right child입니다.
- node 10에서 Lecture convention으로 \(B(10)=\text{height}(\text{right})-\text{height}(\text{left})=+2\)
B(10)=height(right)-height(left)=+2입니다. - 무거운 path가 right-right이므로 RR case입니다.
rotateLeft(10)을 합니다. 결과는 20이 local root, 10이 left child, 30이 right child입니다.- inorder는 전후 모두
10, 20, 30입니다. sorted order는 유지되고 height만 줄었습니다.
AVL 회전(rotation)의 네 경우
| 경우(case) | 무거운 경로 | 복구(repair) | 말로 외우기 |
|---|---|---|---|
| LL | \(z.\text{left} = y, y.\text{left} = x\)z.left = y, y.left = x | rotateRight(z) | 왼쪽의 왼쪽이 무거우면 z를 오른쪽으로 돌립니다. |
| RR | \(z.\text{right} = y, y.\text{right} = x\)z.right = y, y.right = x | rotateLeft(z) | 오른쪽의 오른쪽이 무거우면 z를 왼쪽으로 돌립니다. |
| LR | \(z.\text{left} = y, y.\text{right} = x\)z.left = y, y.right = x | \(\text{rotateLeft}(y) \to \text{rotateRight}(z)\)rotateLeft(y) → rotateRight(z) | 꺾인 모양은 자식을 먼저 펴고 부모를 돌립니다. |
| RL | \(z.\text{right} = y, y.\text{left} = x\)z.right = y, y.left = x | \(\text{rotateRight}(y) \to \text{rotateLeft}(z)\)rotateRight(y) → rotateLeft(z) | LR의 거울 모양입니다. |
AVL insertion에서는 보통 첫 broken node를 고치면 subtree height가 insertion 전과 같아져 repair가 멈춥니다. deletion에서는 height 감소가 위로 전파될 수 있어 root까지 여러 번 rebalancing이 필요할 수 있습니다.
레드-블랙 트리의 필수 성질
- 먼저 BST property를 만족해야 합니다.
- 모든 node는 red 또는 black입니다.
- root는 black입니다.
- NIL leaf, Sentinel, Halbblatt는 black으로 봅니다. 강의는 \(\text{SH}(\text{nil})=0\)
SH(nil)=0으로 둡니다. - red node의 child는 모두 black입니다. 이것이 Nicht-Rot-Rot-Regel입니다.
- 어떤 node에서 아래 NIL leaf까지 가는 모든 path의 black-height(Schwarzhöhe)가 같습니다.
red-red만 확인하면 부족합니다. BST order와 equal black-height까지 모두 맞아야 valid red-black tree입니다.
레드-블랙 트리 삽입·삭제의 직관
삽입 시작(insert start)
새 노드 z를 BST처럼 잎 위치에 넣고 빨강으로 칠합니다. 검정으로 넣으면 한 경로의 검정 높이가 바로 증가해 고치기 어렵습니다.
부모가 검정(parent black)
부모가 검정이면 빨강-빨강 충돌도 없고 검정 높이도 그대로라서 끝입니다.
삼촌이 빨강(uncle red)
부모와 삼촌을 검정, 조부모를 빨강으로 다시 칠해(recoloring) 문제를 위로 올립니다.
삼촌이 검정 또는 nil
지그재그(zig-zag) 모양이면 먼저 회전으로 같은 방향(zig-zig)으로 만들고, 조부모를 중심으로 재색칠과 회전을 수행해 빨강-빨강 충돌을 제거합니다.
루트는 검정(root black)
마지막에 루트를 검정으로 다시 설정합니다.
삭제의 직관(delete intuition)
검정 노드가 사라지면 어떤 경로의 검정 노드 수가 하나 부족해집니다. 삭제 복구(deletion fixup)는 형제와 조카의 색을 보며 이 부족분을 위로 올리거나 회전으로 없앱니다.
AVL 트리와 레드-블랙 트리 비교
| 관점 | AVL 트리(AVL tree) | 레드-블랙 트리(red-black tree) |
|---|---|---|
| 균형 규칙 | 모든 노드의 부분 트리 높이 차이 ≤ 1 | 색 규칙, 빨강-빨강 금지, 동일한 검정 높이 |
| 높이 경계(height bound) | \(h \le 1.441 \log_{2} n\)h ≤ 1.441 log₂ n | \(h \le 2 \log_{2}(n+1)\)h ≤ 2 log₂(n+1) |
| 검색(search) | 더 엄격해서 경로가 보통 짧습니다. | 조금 더 느슨해 경로가 AVL보다 길 수 있습니다. |
| 삽입·삭제(insert/delete) | 균형 위반이 더 자주 생겨 재균형(rebalancing) 부담이 커질 수 있습니다. | 재색칠로 끝나는 경우가 많아 갱신이 많은 작업(update-heavy workload)에 자주 적합합니다. |
| Sheet06 포함 관계 | AVL ⊂ RB | RB ⊂ BST, 하지만 RB가 모두 AVL은 아닙니다. |
자주 생기는 오개념
- rotation이 key 순서를 바꾼다: false. inorder order는 보존됩니다.
- AVL은 perfect tree다: false. 각 node의 두 subtree height 차이가 최대 1이면 됩니다.
- balance factor 부호는 언제나 같다: false. 강의나 책마다 convention이 다를 수 있습니다.
- red node가 있으면 invalid다: false. red-red parent-child edge가 invalid입니다.
- black-height는 normal height와 같다: false. black node만 세는 path count입니다.
- NIL leaf는 무시해도 된다: false. Sentinel/Halbblatt는 black-height 계산에 들어갑니다.
객관식 시험의 함정
- “plain BST search is always \(\Theta(\log n)\)
Θ(log n)”은 틀립니다. plain BST는 \(\Theta(h)\)Θ(h)이고 \(h=\Theta(n)\)h=Θ(n)일 수 있습니다. - “every red-black tree is AVL”은 틀립니다. Sheet06의 관계는
AVL ⊂ RB ⊂ BST입니다. - “every BST is red-black-colorable”은 틀립니다. Sheet06 solution은 separating example을 사용합니다.
- “red-red만 없으면 valid RB”는 틀립니다. black-height와 BST order도 봐야 합니다.
- “LR case는 right rotation 한 번”은 틀립니다. LR은 left rotation on child, then right rotation on parent입니다.
- “red-black은 perfect balance”는 틀립니다. AVL보다 느슨한 logarithmic balance입니다.
- “AVL deletion도 항상 한 번 repair면 끝”은 틀립니다. height 감소가 위로 전파될 수 있습니다.
구두시험 답변 예시
- “plain BST의 search/insert/delete는 height h에 비례합니다”로 시작합니다.
- “h가 \(\Theta(n)\)
Θ(n)이 되면 operation도 \(\Theta(n)\)Θ(n)이므로 balanced tree가 필요합니다”라고 연결합니다. - “AVL은 모든 node에서 \(B(x)=\text{height}(\text{right})-\text{height}(\text{left})\)
B(x)=height(right)-height(left)가 -1,0,+1이어야 합니다”라고 정의합니다. - “rotation은 inorder order를 보존하는 \(\Theta(1)\)
Θ(1)local pointer change입니다”라고 말합니다. - “LL/RR은 single rotation, LR/RL은 double rotation입니다”라고 case를 정리합니다.
- “red-black tree는 BST plus root black, NIL black, no red-red, equal black-height입니다”라고 정의합니다.
- “black-height와 red-red 규칙 때문에 \(h\le 2\log_{2}(n+1),\)
h≤2log2(n+1),그래서 operations are \(\Theta(\log n)\)Θ(log n)”이라고 마무리합니다. - “AVL은 strict/search-friendly, red-black은 looser/update-friendly”라고 비교합니다.
능동 회상 문제
- plain BST operation이 왜 \(\Theta(h)\)
Θ(h)인지 설명하세요. - AVL balance factor를 Lecture 04 convention으로 정의하세요.
- \(\text{height}(\text{empty})=-1\)
height(empty)=-1이면 leaf height가 왜 0인지 말하세요. - 10,20,30 insertion에서 왜 RR case이고 어떤 rotation인지 설명하세요.
- LL/RR/LR/RL의 rotation sequence를 말하세요.
- rotation이 inorder order를 보존하는 이유를 \(A < x < B < y < C\)
A < x < B < y < C로 설명하세요. - red-black properties를 NIL leaf와 black-height까지 포함해 나열하세요.
- uncle red case와 uncle black/nil case를 구분하세요.
AVL ⊂ RB ⊂ BST에서 참인 문장과 거짓인 문장을 하나씩 만드세요.- search-heavy와 update-heavy workload에서 어떤 tree를 고를지 말하세요.
출처에 근거한 설명
Vorlesung/04AdvancedDataStructures.pdf1~6쪽: BST의 \(\Theta(h)\)Θ(h), 레드-블랙 성질, \(\text{SH}(\text{nil})=0,\)SH(nil)=0,레드-블랙 높이 경계.Vorlesung/04AdvancedDataStructures.pdf10~18쪽: 센티널(Sentinel), 회전 알고리즘, BST 삽입 뒤 빨강으로 칠하는 레드-블랙 삽입의 시작.Vorlesung/04AdvancedDataStructures.pdf24~29쪽: 레드-블랙 삽입의 반복 불변식과 \(\Theta(\log n)\)Θ(log n)실행 시간.Vorlesung/04AdvancedDataStructures.pdf31~39쪽: 레드-블랙 삭제 복구의 직관과 실행 시간.Vorlesung/04AdvancedDataStructures.pdf45~50쪽: AVL 정의, 균형 인수의 부호 규칙, 빈 트리 높이 -1, AVL 높이 경계, AVL과 레드-블랙의 장단점.Vorlesung/04AdvancedDataStructures.pdf58~69쪽: AVL 삽입 경우, 회전, 삭제 전파, \(\Theta(\log n)\)Θ(log n)실행 시간.Übung/AuD26_Sheet06.pdf와Übung/AuD26_Sheet06-Sol.pdf: 레드-블랙 삽입·삭제와 유효성, AVL 삽입·삭제와 유효성,AVL ⊂ RB ⊂ BST, 갱신이 많은 경우의 레드-블랙 선택.
AI 후속 학습 프롬프트
Vorlesung/04AdvancedDataStructures.pdf, Übung/AuD26_Sheet06.pdf, Übung/AuD26_Sheet06-Sol.pdf를 첨부합니다.
AUD 시험을 처음 준비하는 학생에게 AVL 트리와 레드-블랙 트리를 한국어로 가르쳐 주세요. AVL 트리(AVL-Baum), 레드-블랙 트리(Rot-Schwarz-Baum), 회전(Rotation), 검정 높이(Schwarzhöhe), 반잎(Halbblatt), 센티널(Sentinel), 빨강-빨강 금지 규칙(Nicht-Rot-Rot-Regel)은 함께 표시하세요.
일반 BST의 높이 h와 Θ(h) 연산부터 시작하세요. 이어서 Lecture 04의 규칙 B(x)=height(right)-height(left), 허용값 {-1,0,+1}, 빈 트리 높이 -1, LL/RR/LR/RL 회전, 삭제 때의 높이 전파를 설명하세요. 그다음 레드-블랙 성질, SH(nil)=0, 삼촌이 빨강인 경우와 검정/nil인 경우의 삽입 복구, 검정 높이 부족으로 보는 삭제, Θ(log n) 실행 시간, AVL과 레드-블랙의 장단점, Sheet06 포함 관계 AVL ⊂ RB ⊂ BST, 객관식 함정을 가르치고 능동 회상 문제를 한 번에 하나씩 내 주세요.
읽는 순서가 보이는 핵심 공식
정의, 수식, 시험 판정 문장을 분리해서 공식이 답안에서 어떻게 쓰이는지 바로 확인합니다.
AVL 균형 인수(balance factor)
AVL은 각 node의 왼쪽과 오른쪽 높이 차이를 제한합니다.
BF(v)=h(left(v))-h(right(v)) ∈ {-1,0,1}- v: 현재 node
- h: 부분 트리 높이(subtree height)
- BF(v): 균형 인수(balance factor)
절댓값이 2가 되면 rotation repair가 필요합니다.
순서를 보존하는 회전
Rotation은 pointer 구조만 바꾸고 inorder 순서는 유지합니다.
keys(A) < x < keys(B) < y < keys(C)- A,B,C: rotation 전후에도 상대 순서가 같은 subtrees
- x,y: rotation에 참여하는 nodes
그래서 rotation 뒤에도 BST invariant가 유지됩니다.
균형 트리의 연산 비용
Balance invariant가 height를 logarithmic으로 제한합니다.
h=O(log n) => search, insert, delete = O(log n)- n: 노드 수(node count)
- h: 트리 높이(tree height)
Plain BST의 \(O(h)\)O(h)와 비교해야 합니다.
레드-블랙 트리의 검정 높이
Red-black tree는 모든 NIL leaf까지의 black node 수를 맞춥니다.
bh(left(v))=bh(right(v))- bh: 검정 높이(black-height)
- NIL 잎: 검정 외부 잎(black external leaves)
이 규칙 때문에 한쪽 경로만 과도하게 길어질 수 없습니다.
빨강 노드 규칙
Red node가 연속으로 나오면 red-black invariant가 깨집니다.
color(v)=red => children(v) are black- v: 빨강 노드(red node)
- children(v): v의 child nodes
root black, red-red 금지, black-height 동일성을 함께 말하세요.
도입: 균형이 필요한 이유
정렬된 입력을 plain BST에 넣으면 height가 \(\Theta(n)\)Θ(n)이 될 수 있습니다. Balanced search tree는 update 후 invariant를 복구해 height를 logarithmic으로 제한합니다.
AVL 회전의 네 경우
Insertion path를 위로 올라가며 처음 balance factor가 -2 또는 2가 된 node를 찾습니다. 방향이 같으면 LL/RR single rotation, 다르면 LR/RL double rotation입니다.
레드-블랙 트리의 직관
Red-black tree는 색 규칙으로 전체 height를 제한합니다. AVL보다 느슨하지만 update가 실용적으로 좋습니다.
선수 개념과 필수 용어 (Prerequisites and Vocabulary)
- BST의 부분 트리 전체 순서 불변식
- Tree height와 \(O(h)\)
O(h)operation cost - Inorder traversal이 BST에서 sorted order를 준다는 사실
핵심 학습 항목 (Active Recall With Hints)
1
- AVL balance factor를 공식과 말로 설명하세요.
2
- LL, RR, LR, RL 중 single rotation과 double rotation을 구분하세요.
3
- Rotation이 왜 BST order를 보존하는지 설명하세요.
4
- Red-black tree의 색 규칙을 세 개 말하세요.
5
- Plain BST와 balanced BST의 runtime 차이를 비교하세요.
구두시험 답변 연습 (Oral Exam Scripts)
AVL과 red-black tree는 balanced BST입니다. BST order invariant 위에 height를 제한하는 balance invariant가 추가됩니다.
AVL에서는 \(\text{BF}(v)=h(\text{left})-h(\text{right})\)BF(v)=h(left)-h(right)를 계산하고 -1,0,1을 벗어나면 rotation으로 고칩니다.
출처에 근거한 설명 (Source-Grounded Notes)
- Vorlesung\03BasicDataStructures.pdf: BST의 높이에 의존하는 연산 비용과 트리 용어.
- Sheet05: BST 삽입·순회·삭제와 탐색 경로 경계 연습.
관련 개념
다음 튜터 프롬프트
마지막 생성: 2026-08-03 03:24