# AVLํธ๋ฆฌ (AVL Tree)
written by sohyeon, hyemin ๐ก
# 1. AVLํธ๋ฆฌ๋?
AVLํธ๋ฆฌ
๋ ์ฝ๊ฒ ๋งํด ๊ท ํ์ก์ธ ์ด์งํ์ํธ๋ฆฌ
์ด๋ค.
์๋ธํธ๋ฆฌ์ ๋์ด๋ฅผ ์ ์ ํ๊ฒ ์ ์ดํด ์ ์ฒด ํธ๋ฆฌ๊ฐ ์ด๋ ํ์ชฝ์ผ๋ก ๋์ด์ง์ง ์๋๋ก ํ ์ด์งํ์ํธ๋ฆฌ์ ์ผ์ข
์ด๋ค.
ํธ๋ฆฌ์ ๋์ด๊ฐ h์ผ ๋ ์ด์งํ์ํธ๋ฆฌ์ ๊ณ์ฐ๋ณต์ก์ฑ์ O(h)์ด๊ธฐ ๋๋ฌธ์
๊ท ํ๋ ํธ๋ฆฌ๋ฅผ ๋ง๋ค์ด h๋ฅผ ์ค์ด๊ณ ์ ํ๋ ๋ฐ์์์ ๋น๋กฏ๋์ต๋๋ค.
๋ฃจํธ ๋ ธ๋์ ์ข์ธก ์๋ธ๋ ธ๋์ ์ฐ์ธก ์๋ธ๋ ธ๋์ ๋์ด ์ฐจ์ด๊ฐ 1๋ณด๋ค ํฌ์ง ์์ ํํ์ด๋ค.
# 1-1. ๊ท ํ๊ณ์(BF, Balance Factor)
BalanceFactor = height(left subtree) - height(right subtree)
์ผ์ชฝ ์๋ธํธ๋ฆฌ์ ๋์ด์์ ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ์ ๋์ด๋ฅผ ๋บ ๊ฒ์ด๋ค.
๋ ์๋ธํธ๋ฆฌ์ ๋์ด๊ฐ ๊ฐ๊ฑฐ๋ ์์๋
ธ๋๋ผ๋ฉด BF๋ 0์ด๋ค(empty tree์ BF๋ -1๋ก ์ ์).
BF๋ ์ ์ ๋ฒ์ [-1, + 1]์ธ๋ฐ ๋
ธ๋ ์ฝ์
์ดํ์ ๊ทธ๋ํ์ ๊ท ํ ๊ณ์๊ฐ -1๋ณด๋ค ์๊ฑฐ๋ +1๋ณด๋ค ํด ์ ์๋ค.
์ด ๊ฒฝ์ฐ ํ์ ์ ํตํด ๊ท ํ์ ๋ง์ถฐ์ค ์ ์๋ค.
# 2. ํ์ (Rotation)
์ฝ์ ์ผ๋ก ์ธํ ๋ถ๊ท ํํด์ง ๊ทธ๋ํ์ ๊ท ํ์ ๋ง์ถ๋ค.
# 2-1. Single Rotation
single rotation์ rotation์ ํ ์ฐจ๋ก ์ํํด BF๊ฐ 0์ธ ๊ท ํ์กํ ๊ทธ๋ํ๋ฅผ ์ป์ ์ ์๋ ๊ฒฝ์ฐ๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
Single Rotation์ ํ์ ๋ฐฉํฅ์ ๋ฐ๋ผ ๋๊ฐ์ง๋ก ๋๋์ด์ง๋ค.
- Single Left Rotation
- Single Right Rotation
# ์คํ ๊ธฐ์ค
์ฝ์ ์ฐ์ฐ์ single rotation์ ๋ค์ ๋ ๊ฐ์ง ๊ฒฝ์ฐ์ ์ค์๋๋ค.
X
: BF์ ์ ๋๊ฐ์ด 2 ์ด์์ด๋ฉด์ ์ ๋
ธ๋์ ๊ฐ์ฅ ๊ฐ๊น์ด ์กฐ์ ๋
ธ๋
Y
: ์์๋
ธ๋, BF ์ ๋๊ฐ์ด 1 ์ดํ์ธ ๋
ธ๋
- Y๊ฐ X์ ์ผ์ชฝ ์์๋ ธ๋, Y์ ์ผ์ชฝ ์๋ธํธ๋ฆฌ์ ์ ๋ ธ๋๊ฐ ์ฝ์ ๋ ์ํ : Y๋ฅผ ๊ธฐ์ค์ผ๋ก right rotation
- Y๊ฐ X์ ์ค๋ฅธ์ชฝ ์์๋ ธ๋, Y์ ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ์ ์ ๋ ธ๋๊ฐ ์ฝ์ ๋ ์ํ : Y๋ฅผ ๊ธฐ์ค์ผ๋ก left rotation
# Single Right Rotation ์์
์์ ์์๋ฅผ ๋ณด๋ฉด 'BF๊ฐ 2 ์ด์, 2 ์ดํ์ผ ๋ rotation์ ์ค์ํ๋ค'๋ ์กฐ๊ฑด์ ๋ถํฉํ๋ค.
X์ ์ผ์ชฝ ์์๋
ธ๋์ธ Y๋ฅผ ๊ธฐ์ค์ผ๋ก single rotation์ ์ค์ํ๋ค.
Y๋ฅผ ์๋ก์ด ๋ฃจํธ๋
ธ๋๋ก ๋ง๋ค๊ณ T1๋ง h+1์ด๊ณ ๋๋จธ์ง๋ ๋ชจ๋ h์ธ ์ ์ ๊ฐ์ํ๋ฉด
rotation ์ค์ ํ์ X, Y์ BF๋ ๊ฐ๊ฐ 0, 0์ด ๋์ด ๊ท ํ ํธ๋ฆฌ๋ฅผ ์ด๋ฃฌ๋ค.
# 2-2. Double Rotation
rotation ํ ์ฐจ๋ก๋ง์ผ๋ก ์ํ๋ ์ฝ์
๊ฒฐ๊ณผ๋ฅผ ๋ด์ง ๋ชปํ๋ ์ผ์ด์ค๊ฐ ์กด์ฌํ๋ค.
์ด ๊ฒฝ์ฐ ๋๋ฒ์ rotation์ ์ํํด ๊ท ํ์ ๋ง์ถ๋ค.
single rotation๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ฐฉํฅ์ ๋ฐ๋ผ ๋๊ฐ์ง๋ก ๋๋๋ค.
- Double Left Rotation
- Double Right Rotation
# ์คํ๊ธฐ์ค
์ฝ์ ์ฐ์ฐ์ double rotation์ ๋ค์ ๋ ๊ฐ์ง ๊ฒฝ์ฐ์ ์ค์๋๋ค.
X
: BF์ ์ ๋๊ฐ์ด 2 ์ด์์ด๋ฉด์ ์ ๋
ธ๋์ ๊ฐ์ฅ ๊ฐ๊น์ด ์กฐ์ ๋
ธ๋
Y
: X์ ์์๋
ธ๋์ด๋ฉด์ BF ์ ๋๊ฐ์ด 1์ดํ
- Y๊ฐ X์ ์ผ์ชฝ ์์๋ ธ๋, Y์ ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ์ ์ ๋ ธ๋๊ฐ ์ฝ์ ๋ ๊ฒฝ์ฐ
- Y๊ฐ X์ ์ค๋ฅธ์ชฝ ์์๋ ธ๋, Y์ ์ผ์ชฝ ์๋ธํธ๋ฆฌ์ ์ ๋ ธ๋๊ฐ ์ฝ์ ๋ ๊ฒฝ์ฐ
์์ ๊ทธ๋ฆผ ์์๋ X, Y, Z์ BF๊ฐ ๊ฐ๊ฐ 2, -1, 1์ด ๋๋ค.
๋ฐ๋ผ์ X๋ฅผ ๋ฃจํธ๋
ธ๋๋ก ํ๋ ์๋ธํธ๋ฆฌ๊ฐ ๊ท ํ์ ๋ง์ถฐ์ผ๋ ๋์์ด ๋๋ค.
# Double Right Lotation ์์
- ์ฒซ๋ฒ์งธ : Z๋ฅผ ์ค์ฌ์ผ๋ก left rotation ์ํ (T1๋ฅผ ์ก์ ๋น๊ฒจ ๋ด๋ฆฌ๋ ๊ณผ์ )
- ๋๋ฒ์งธ : Z๋ฅผ ์ค์ฌ์ผ๋ก right rotation ์ํ (T4๋ฅผ ์ก์ ๋น๊ฒจ ๋ด๋ฆฌ๋ ๊ณผ์ )
์ ๊ณผ์ ์ ์ํํ๊ณ ๋๋ฉด BF๊ฐ ๊ฐ๊ฐ -1, 0, 0์ด ๋์ด์ ๊ท ํ์ ์ด๋ฃจ๊ฒ ๋๋ค.
# 3. ์์ ํ๋ก๊ทธ๋จ
โ ์ฐ๋ ๋(Thread) ๋ฐฐ์ด (Array) โ