AVL ํธ๋ฆฌ
AVL ํธ๋ฆฌ๋ ํธ๋ฆฌ๊ฐ ํ์ชฝ์ผ๋ก ์น์ฐ์น๋ ๊ฒ์ ๋ฐฉ์งํ์ฌ ํธ๋ฆฌ ๋์ด์ ๊ท ํ์ ์ ์งํ๋ค๋ ํน์ง์ด ์๋ค.
์ฆ, ์ฝ์ ์ด๋ ์ญ์ ์์ ๊ท ํ์ด ์ด๊ธ๋๊ฒ ๋๋ฉด ์ค์ค๋ก ํ์ ์ฐ์ฐ์ ํตํด ๊ท ํ์ ์ ์งํ๋,
์์ฒด ํ๋ง์ด ๊ฐ๋ฅํ ํธ๋ฆฌ์ด๋ค.
์ด๋ฌํ AVL ํธ๋ฆฌ(a.k.a ๊ท ํ ํธ๋ฆฌ)๋ฅผ ์ฌ์ฉํ๋ ์ด์ ๋ ํ์, ์ฝ์ , ์ญ์ ์ฐ์ฐ ์์ ๊ท ์ผํ ์ํ ์๊ฐ O(logN)์ ๋ณด์ฅํ๊ธฐ ๋๋ฌธ์ธ๋ฐ, ์ด๋ AVL ํธ๋ฆฌ์ ๋์ด์ ๊ด๊ณ๊ฐ ์๋ค.
n๊ฐ์ ๋ ธ๋๋ฅผ ๊ฐ์ง AVL ํธ๋ฆฌ์ ๋์ด๋ O(logN)์ด๋ค.
AVL ํธ๋ฆฌ์ ์ ํํ ์ ์๋ฅผ ์์๋ณด์.
AVL ํธ๋ฆฌ๋ ์์์ ๋ ธ๋ x์ ๋ํด x์ ์ผ์ชฝ ์๋ธํธ๋ฆฌ์ ๋์ด์ ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ์ ๋์ด ์ฐจ์ด๊ฐ 1์ ๋์ง ์๋ ์ด์ง ํ์ ํธ๋ฆฌ์ด๋ค.
AVL ํธ๋ฆฌ์ ํ์ ์ฐ์ฐ
ํ์ ์ฐ์ฐ์ ๊ฒฝ์ฐ
AVLํธ๋ฆฌ๋ ํ์ ์ฐ์ฐ์ ํตํด ๊ท ํ์ ์ ์งํ ์ ์๋ค๊ณ ํ๋ค.
์ด๋ฌํ ํ์ ์ฐ์ฐ์ ์ข ๋ฅ๋ก๋ ํฌ๊ฒ 4๊ฐ์ง๊ฐ ์๋ค.
LL-ํ์ , RR-ํ์ , LR-ํ์ , RL-ํ์ ์ฐ์ฐ์ ์ฌ์ฉํ๋ค.
๊ฐ ๊ฒฝ์ฐ๊ฐ ๋ฌด์จ ๋ง์ด๋ ์๊ธฐ ์ํด์ ๊ท ํ ์ธ์ ๋ผ๋ ๊ฒ์ ๋ํด ์์๋ณผ ํ์๊ฐ ์๋ค.
๊ท ํ ์ธ์๋ ์ผ์ชฝ ์๋ธ ํธ๋ฆฌ์ ๋์ด์ ์ค๋ฅธ์ชฝ ์๋ธ ํธ๋ฆฌ์ ๋์ด์ ์ฐจ ์ด๋ค.
์ด๋ฌํ ๊ท ํ ์ธ์์ ์ ๋๊ฐ์ด ๋ง์ฝ 2๋ฅผ ๋๊ธด๋ค๋ฉด, ์ด๋ ๋ถ๊ท ํ์ ์ด๋ผ๊ณ ํ๋ค.
์ ์ด์ ์ฐ๋ฆฌ๋ LL, LR, RL, RR ํ์ ์ ๊ฒฝ์ฐ๋ฅผ ์ดํดํ ์ ์๋ค.
LLํ์ ์ ๊ท ํ์ธ์๊ฐ +2๊ฐ ๋๋ ์ํฉ, ์ฆ ์ผ์ชฝ ์๋ธ ํธ๋ฆฌ์ ๋์ด๊ฐ ์ค๋ฅธ์ชฝ ๋ณด๋ค 2๋งํผ ๋ ํฌ๋ค๋ ์๋ฆฌ์ด๋ค.
RR ํ์ ์ -2๊ฐ ๋๋ ์ํฉ์์ ์์ฐ์ค๋ฝ๊ฒ ์ง์ํ ์ ์๋ค.
์ฆ, ์ค๋ฅธ์ชฝ ํธ๋ฆฌ์ ๋์ด๊ฐ ์ผ์ชฝ๋ณด๋ค 2๋งํผ ๋ ํฐ ์ํฉ์ด๋ผ๋ ๊ฒ์ด๋ค.
์ฝ๊ฒ ์๊ฐ ํ์๋ฉด L์ +1์ด ๋๋ ์ํฉ, R์ -1์ด ๋๋ ์ํฉ์ผ๋ก ๋ ์ ์๋ค.
๊ทธ๋ ๋ค๋ฉด, LRํ์ ๊ณผ RL ํ์ ์ ๋ฌด์์ธ๊ฐ?
ํธ๋ฆฌ๊ฐ ์ ์์์ฒ๋ผ ์๋ธํธ๋ฆฌ๋ ์ผ์ชฝ์ผ๋ก ์น์ฐ์ณ ์ง๊ฒ ์๋ ๋ค๋ฅธ ๊ฒฝ์ฐ๋ ์์ ๊ฒ์ด๋ค.
๊ทธ๋ฆผ์ ํ๋ฒ ๋ณด์.
์์์ ๋ถํฐ ๋ด๋ ค์ค๋ฉด์ ์ด ํธ๋ฆฌ ๋ ๋ฒจ์ 2๊ฐ์ฉ ๊ทธ๋ฃน์ง์ด ์ดํด๋ณด๋ฉฐ ๋ด๋ ค์ค๋ฉด ์ดํดํ๊ธฐ ์ฝ๋ค.
์ฒ์์ ๊ฒฝ์ฐ์๋ +1์ ๊ฒฝ์ฐ์ด๋ค. ์ผ์ชฝ์ผ๋ก ์น์ฐ์ณ์ ์์ผ๋ฏ๋ก L์ด๋ค.
๋ค์ ๋ ๋ฒจ๋ก ๋ด๋ ค์์ ์ดํด๋ณด๋ฉด ์ค๋ฅธ์ชฝ์ผ๋ก ์น์ฐ์ณ์ ์๋ค. ์ด๋ R์ด๋ค.
๊ทธ๋์ ์ด ๊ทธ๋ฆผ์ ๊ฒฝ์ฐ๋ LR ํ์ ์ ๊ฒฝ์ฐ๋ผ๊ณ ๋ณผ ์ ์๋ค.
RL ํ์ ์ ๊ฒฝ์ฐ๋ ์ด์ ๋ฐ๋๋๋ ๊ฐ๋ ์ด๋ฏ๋ก ์ฝ๊ฒ ์๊ฐํ ์ ์๋ค.
ํ์ ์ฐ์ฐ ํจ์
์, ์ด์ ํ์ ์ฐ์ฐ ํจ์๋ฅผ ์ดํด๋ณด๋๋ก ํ์.
๊ธฐ๋ณธ์ ์ผ๋ก ๋๊ฐ์ง ์ฐ์ฐ์ผ๋ก ๋๋๋ค.
rotateLeft(), rotateRight()
์ด ๋๊ฐ์ ํจ์๋ ์์ ๋ฐฐ์ ๋, LL, RR, LR, RL ํ์ ์ ์์ด ์ค์ง์ ์ผ๋ก ๊ท ํ์ ์ก์์ค๋ค.
์ด๋ฆ๋ง ๋ณด๋ฉด ์ ์ ์๋ฏ์ด ์ค์ ํธ๋ฆฌ์์ ์ค๋ฅธ์ชฝ์ผ๋ก ํ์ , ์ผ์ชฝ์ผ๋ก ํ์ ์ด๋ผ๊ณ ์๊ฐํ๋ฉด ์ดํดํ๊ธฐ ์์ํ๋ค.
๋จผ์ rotateRight ํจ์๋ฅผ ๊ทธ๋ฆผ๊ณผ ํจ๊ป ์ฝ๋๋ก ์ดํด๋ณด์.
private Node rotateRight(Node n) {
// Node x๋ n์ ์ผ์ชฝ ๋
ธ๋์ด๋ค. -> ์ค์ง์ ์ผ๋ก ์ด๋์ ์ค๋ฅธ์ชฝ์ผ๋ก ์ฎ๊ธธ ๊ฒ์ด๋ค.
Node x = n.left;
// ๊ทธ๋ ๊ฒ ํ๊ธฐ ์ํด x์ ์ค๋ฅธ์ชฝ ์์์ n์ ์ผ์ชฝ ์์์ผ๋ก ๋๊ณ
// ๊ทธ๋์ผ ์ด์ง ํธ๋ฆฌ ์กฐ๊ฑด์ ๋ง์กฑ์ํค๊ธฐ ๋๋ฌธ
n.left = x.right;
// x์ ์ค๋ฅธ์ชฝ ์์ ์ n์ผ๋ก ๋๋ค.(์ฌ๊ธฐ์ ์ด๋!)
x.right = n;
// n๊ณผ x์ ๋์ด ๊ฐฑ์
n.height = tallerHeight(height(n.left), height(n.right) + 1;
x.height = tallerHeight(height(x.left), height(x.right) + 1;
return x;
}
rotateRight์ ๋ง์ฐฌ๊ฐ์ง๋ก rotateLeft๋ ๋น์ทํ๊ฒ ์งํ๋๋ค.
๊ธฐ์กด์ n์ ์ค๋ฅธ์ชฝ ์์์ด์๋ x๋ฅผ n๊ณผ ๊ต์ฒดํ์ฌ ์ผ์ชฝ์ผ๋ก ํ์ ์ํจ ๊ฒ์ด๋ค.
private Node roateLeft(Node n) {
// x๋ n์ ์ค๋ฅธ์ชฝ ์์์ด๋ค. -> ์ค์ง์ ์ผ๋ก n๊ณผ ๋ฐ๊พธ์ด ์ผ์ชฝ ์๋ก ์ฌ๋ฆด ๋
์์
Node x = n.right;
// n์ ์ค๋ฅธ์ชฝ ์์์ x์ ์ผ์ชฝ ์์์ด ๋๋ค.
// ์ด๋์ผ ์ด์ง ํธ๋ฆฌ์ ์กฐ๊ฑด ๋ง์กฑ
n.right = x.left;
// x์ ์ผ์ชฝ ์์์ n์ด ๋๋ค.(์ค์ง์ ์ด๋)
x.left = n;
// ๋์ด ๊ฐฑ์
n.height = tallerHeight(height(n.left), height(n.right)) + 1;
x.height = tallerHeight(height(xleft), height(x.right)) + 1;
return;
}
ํ์ ์ํ
rotateLeft์ rotateRight์ ํจ์๋ฅผ ์ดํดํ์๋ค๋ฉด, LL,RR, LR, RL ํ์ ์ ๊ฒฝ์ฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒ์ ๋งค์ฐ ์ฝ๋ค.
- LLํ์ : LLํ์ ์ ๊ธฐ์ค์ด ๋๋ ๋งจ ์ ๋ ธ๋ rotateRight ์ํ
- RRํ์ : RRํ์ ์ ๊ธฐ์ค์ด ๋๋ ๋งจ ์ ๋ ธ๋ rotateLeft ์ํ
- LRํ์ : ๋ฐ์์๋ถํฐ rotateLeft, rotateRight ์ํ
- RLํ์ : ๋ฐ์์๋ถํฐ rotateRight, rotateLeft ์ํ
LL์ด๋ RR์ผ๋๋ ์๊ธ์ ๋ฐ์ ๋ฐ๋๋ก ์๊ฐํ๋ฉด์ ์ธ์ฐ๊ณ , LR๊ณผ RL์ ๊ทธ๋๋ก ์๊ฐํ๋ฉด์ ์ธ์ฐ๋๋ฐ ์ด๋ ๋ฐ์์ ๋ถํฐ ์ํํ๋ค๊ณ ์๊ฐํ์.
LL์ด๋ RR์ผ๋๋ ๋์ถฉ ์๊ฒ ๋๋ฐ, LR๊ณผ RL์ ์ด์ง ํท๊ฐ๋ฆด ์ ์๋ค.
์๋ ๊ทธ๋ฆผ์ฒ๋ผ n์ ๊ธฐ์ค์ผ๋ก ๋จผ์ rotateLeft๋ฅผ ์คํํ๊ณ ๊ทธ๋ค์์ผ๋ก m์ ๊ธฐ์ค์ผ๋ก rotateRight๋ฅผ ์ํํ๋ผ๋ ๋ป์ด๋ค.
RLํ์ ๋ ๋ง์ฐฌ๊ฐ์ง๋ก ์๊ฐํ ์ ์๋ค.
์ฆ, LRํ์ ๊ณผ RLํ์ ๊ฒฝ์ฐ์ ๊ตฌ๋ถ์ ์์์ ๋ถํฐ ๋ ๋ฒจ ๋จ์๋ก ์๊ฐํ๋ฉด ์ฝ๊ณ ,
์ค์ LRํ์ ๊ณผ RLํ์ ์์ ํจ์ ์ ์ฉ์ ์๊ธ์๋ฅผ ๋ฐ๊ณ ๋ฐ์์ ๋ถํฐ rotateLeft, rotateRight ๊ทธ๋ฆฌ๊ณ roateRight, rotateLeft๋ฅผ ์ ์ฉํ๋ฉด ๋๋ค.
์ ํํ ๊ตฌ๋ถํ๋ ค๋ฉด,
LLํ์ ์ ๊ท ํ์ธ์๊ฐ +2์ด์์ด๊ณ ํ์ ๋ ธ๋๋ +์ธ ๊ฒฝ์ฐ์ด๋ฉฐ,
RRํ์ ์ ๊ท ํ์ธ์๊ฐ -2์ดํ์ด๊ณ , ํ์ ๋ ธ๋๋ -์ธ ๊ฒฝ์ฐ,
LRํ์ ์ ๊ท ํ์ธ์๊ฐ +2์ด์์ด๊ณ , ํ์ ๋ ธ๋๋ ๋ฐ๋๋ก -์ธ ๊ฒฝ์ฐ,
RLํ์ ์ ๊ท ํ์ธ์๊ฐ -2์ดํ์ด๊ณ , ํ์ ๋ ธ๋๋ ๋ฐ๋๋ก +์ธ ๊ฒฝ์ฐ์ด๋ค.
๊ทธ๋ฅ L์ ๊ท ํ์ธ์ +, R์ ๊ท ํ์ธ์ -์ผ๋ ์ฌ์ฉํ๋ค๊ณ ์๊ฐํ์.
4์ข ๋ฅ์ ํ์ ์ ๊ณตํต์ ์ ํ์ ํ์ ํธ๋ฆฌ๋ค์ด ๋ชจ๋ ๊ฐ๋ค๋ ๊ฒ.
๊ทธ๋ฆฌ๊ณ ๊ฐ ํ์ ์ฐ์ฐ์ ์ํ์๊ฐ์ O(1)์ด๋ผ๋ ๊ฒ์ด๋ค.
AVL ํธ๋ฆฌ์ ์ฝ์ ์ฐ์ฐ
AVL ํธ๋ฆฌ์ ์ฝ์ ์ฐ์ฐ์ ๋ค์๊ณผ ๊ฐ์ ๊ณผ์ ์ ๋ฐ๋ฅธ๋ค.
1. ์ด์ง ํ์ ํธ๋ฆฌ์ ์ฝ์ ๊ณผ ๋์ผํ๊ฒ ์ ๋ ธ๋ ์ฝ์
2. ์ ๋ ธ๋๋ก๋ถํฐ ๋ฃจํธ๋ก ๊ฑฐ์ฌ๋ฌ ์ฌ๋ผ๊ฐ๋ฉฐ ๊ฐ ๋ ธ๋์ ์๋ธํธ๋ฆฌ ๋์ด ์ฐจ์ด๋ฅผ ๊ฐฑ์
์ด๋ ๊ฐ์ฅ ๋จผ์ ๋ถ๊ท ํ์ด ๋ฐ์ํ ๋ ธ๋๋ฅผ ๋ฐ๊ฒฌํ๋ฉด, ์ด ๋ ธ๋๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ๋ ธ๋๊ฐ ์ด๋์ ์ฝ์ ๋์๋์ง์ ๋ฐ๋ผ ์ ์ ํ ํ์ ์ฐ์ฐ์ ์ํํ๋ค.
AVL ํธ๋ฆฌ๋ฅผ ์ํ Node ํด๋์ค์ ์ฝ์ ๋ฉ์๋๋ฅผ ์ดํด๋ณด์.
// AVL ํธ๋ฆฌ๋ฅผ ์ํ Node ํด๋์ค
public class Node {
// Key, Value๊ฐ๊ณผ ์ผ์ชฝ, ์ค๋ฅธ์ชฝ ์์ ๋
ธ๋ ์ ์ธ
private Key id;
private Value name;
private int height;
private Node left, right;
public Node(Key newID, Value newName, int newHt) {
id = newID;
name = newName;
height = newHt;
left = right = null;
}
}
// ์ฝ์
ํจ์ ํธ์ถ
public void put(Key k, Value v) { root = put(root, k, v); }
private Node put(Node n, Key k, Value v) {
// n์ด null์ด๋ผ๋ฉด ์ด๋ root๋
ธ๋๊ฐ ์๋ ๊ฒ์ด๋ฏ๋ก ์๋ก์ด ๋
ธ๋ ๋ฐํ, ๋์ด๋ 1
// ๋๋ ์ฝ์
๋ ๋
ธ๋๋ฅผ ๋งํจ. ๋งจ ๋ง์ง๋ง ์ดํ๋ฆฌ์ ๋๋ฌํ ๊ฒฝ์ฐ ์์ฑ
// ์ด ๊ฒฝ์ฐ, ๋ฆฌํด๋๋ฏ๋ก ๋ฐ์ ํค ๋น๊ต ๋ถ๋ถ์ ๋์ด๊ฐ
if (n == null) return new Node(k, v, 1);
// ํค์ n๋ฅผ ๋น๊ต
int t = k.compareTo(n.id);
// ๋ง์ฝ t๊ฐ 0๋ณด๋ค ์๋ค๋ฉด k๊ฐ ๋
ธ๋ n์ ํค๋ณด๋ค ์์ ๊ฒ์ด๋ฏ๋ก n์ ์ผ์ชฝ ์์์ ํด๋น kํค๋ฅผ ๊ฐ์ง ๋
ธ๋ ์ฝ์
if (t < 0) n.left = put(n.left, k, v);
// ๋ง์ฝ์ t๊ฐ 0๋ณด๋ค ํฌ๋ค๋ฉด, k๊ฐ ๋
ธ๋ n์ ํค๋ณด๋ค ํฌ๋ฏ๋ก, n์ ์ค๋ฅธ์ชฝ ์์์ ์ฝ์
else if (t > 0) n.right = put(n.right, k, v);
// t๊ฐ 0์ธ ๊ฒฝ์ฐ์ธ๋ฐ, ์ด๋ k๊ฐ ์ด๋ฏธ ํธ๋ฆฌ์ ์๋ ๊ฒฝ์ฐ์ด๋ฏ๋ก value๋ง ๊ฐฑ์
else {
n.name = v;
return n;
}
// n์ ๋์ด ๊ฐฑ์
n.height = tallerHeight(height(n.left), height(n.right)) + 1;
// ๋
ธ๋ n์ ๊ท ํ ์ ๊ฒ ๋ฐ ๋ถ๊ท ํ์ ๋ฐ๋ก ์ก์. ์ฌ๊ธฐ์ ๊ฐ ํ์ ์ฐ์ฐ์ด ์ผ์ด๋จ
return balance(n);
}
์ฝ๋์ ๋ํ ์ฃผ์์ ์ฝ์ผ๋ฉด ์ฝ๊ฒ ์ดํดํ ์ ์์ ๊ฒ์ด๋ค.
์ฌ์ค ์ ์ ์ผ ์ค์ํ balance ํจ์์ ๋ํด ์์์ผ ํ๋ค.
๋ฐ๋ก ์ฌ๊ธฐ์ LL, RR, LR, RLํ์ ์ด ์ผ์ด๋๊ธฐ ๋๋ฌธ์ด๋ค.
private Node balance(Node n) {
// ๋
ธ๋ n์ ์ผ์ชฝ ์๋ธํธ๋ฆฌ๊ฐ ๋์์ ๋ถ๊ท ํ์ด ๋ฐ์ํจ -> ์ฆ, 2 ์ด์์ธ ๊ฒฝ์ฐ
if (bf(n) > 1) {
// n์ ์ผ์ชฝ ์์ ๋
ธ๋์ ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ๊ฐ ๋์ ๊ฒฝ์ฐ -> ์ฆ, -1 ์ดํ์ธ ๊ฒฝ์ฐ
// ์ด ์กฐ๊ฑด๋ฌธ์ด ์คํ๋๋ค๋ฉด LR ํ์ ์
if (bf(n.left) < 0) {
n.left = rotateLeft(n.left);
}
// ์ด๊ฒ๋ง ์คํ๋๋ค๋ฉด LLํ์
n = rotateRight(n);
}
// ๋
ธ๋ n์ ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ๊ฐ ๋์์ ๋ถ๊ท ํ์ด ๋ฐ์ํจ -> ์ฆ, -2 ์ดํ์ธ ๊ฒฝ์ฐ
// ์ฆ, rotateLeft ํ์
else if (bf(n) < -1) {
// n์ ์ค๋ฅธ์ชฝ ์์ ๋
ธ๋์ ์ผ์ชฝ ์๋ธํธ๋ฆฌ๊ฐ ๋์ ๊ฒฝ์ฐ -> ์ฆ, 1 ์ด์์ธ ๊ฒฝ์ฐ
// ์ด ์กฐ๊ฑด๋ฌธ์ด ์คํ๋๋ค๋ฉด RL ํ์ ์
// ์ฆ, rotateRight๊ฐ ํ์
if (bf(n.right) > 0) {
n.right = rotateRight(n.right);
}
// ์ด๊ฒ๋ง ์คํ๋๋ค๋ฉด RRํ์
n = rotateLeft(n);
}
return n;
}
// ์๋๋ ๊ท ํ์ธ์๋ฅผ ๋ฐํํ๋ bf ๋ฉ์๋์ ๋ค๋ฅธ ์ ํธ๋ฆฌํฐ ๋ฉ์๋
private int bf(Node n) {
return height(n.left) - hegiht(n.right);
}
private int height(Node n) {
if (n == null) return 0;
return n.height;
}
private int tallerHeight(int x, int y) {
if (x>y) return x;
else return y;
}
AVL ํธ๋ฆฌ์ ์ญ์ ์ฐ์ฐ
๋ง์ง๋ง์ผ๋ก ์ญ์ ์ฐ์ฐ์ด๋ค.
์ญ์ ์ฐ์ฐ์ ๋ค์๊ณผ ๊ฐ์ ๋จ๊ณ๋ฅผ ๋ฐ๋ฅธ๋ค.
1. ์ด์ง ํ์ ํธ๋ฆฌ์์์ ๋์ผํ ์ญ์ ์ฐ์ฐ์ ์ํํ๋ค.
2. ์ญ์ ๋ ๋ ธ๋๋ก๋ถํฐ ๋ฃจํธ ๋ฐฉํฅ์ผ๋ก ๊ฑฐ์ฌ๋ฌ ์ฌ๋ผ๊ฐ๋ฉฐ ๋ถ๊ท ํ์ด ๋ฐ์ํ ๊ฒฝ์ฐ ์ ์ ํ ํ์ ์ฐ์ฐ์ ์ํํ๋ค.
์ด ๋, ํ์ ์ฐ์ฐ ์ํ ํ์ ๋ถ๋ชจ์์ ๋ถ๊ท ํ์ด ๋ฐ์ํ ์ ์๊ณ , ์ด๋ฌํ ์ผ์ด ๋ฐ๋ณต๋์ด ๋ฃจํธ์์ ํ์ ์ฐ์ฐ์ ์ํํ๋ ๊ฒฝ์ฐ๋ ๋ฐ์ํ๋ค.
์ฝ์ ์ด๊ฑด, ์ญ์ ๊ฑด ๊ฒฐ๊ตญ ์ด์ง ํ์ ํธ๋ฆฌ์ด๊ธฐ ๋๋ฌธ์ ์ด์ง ํ์ ํธ๋ฆฌ์ ๋ํ ์ดํด๊ฐ ๊ต์ฅํ ํ์ํ๋ค.
์ญ์ ์ฐ์ฐ์ ๊ตฌํ์ ์ญ์ ํ, ๋ถ๊ท ํ์ด ๋ฐ์ํ๋ฉด ๋ฐ๋์ชฝ์ ์ฝ์ ์ด ์ด๋ฃจ์ด์ ธ ๋ถ๊ท ํ์ด ๋ฐ์ํ ๊ฒ์ผ๋ก ์ทจ๊ธํ๋ค.
๋ค์ ์์ ๋ฅผ ๋ณด์.
40์ ์ญ์ ํ๋ ค๊ณ ํ๋ ๊ฒฝ์ฐ, ๋ ธ๋ 30์์ ๋ถ๊ท ํ์ด ๋ฐ์ํ๊ฒ ๋๋ค.
์ด ๊ฒฝ์ฐ LR ํ์ ์ ์์ผ์ผ ํ๋ ์ํฉ์ด ๋๋ค.
์ฆ, rotateLeft, rotateRight๋ฅผ ๋ฐ์์ ๋ถํฐ ์ํํ๋ค.
๊ทธ๋ฌ๋ฉด 20์ ์ผ์ชฝ ์์์ด 10์ด ๋๊ณ , 20์ ์ค๋ฅธ์ชฝ ์์์ด 30์ด ๋๋ค.
๊ทธ๋ฌ๋ฉด ์์ ๊ฐ์ ๊ผด์ด ๋ ํ ๋ฐ
์ผ์ชฝ ํธ๋ฆฌ๋ LR์ด ์ํ๋ ์ดํ์ ํธ๋ฆฌ์ด๋ค.
์ฌ๊ธฐ์ RL์ ์ด์ ์ํํด์ผํ๋๋ฐ(์ด์ ๋ ๊ท ํ์ธ์๊ฐ ์์์ ๋ถํฐ -2์ดํ, ๊ทธ ๋ฐ์ ๋ ธ๋๋ +์ด๋ฏ๋ก)
์์ ๊ฐ์ด RL ํ์ ์ ์ํํ๋ฉด ์ค๋ฅธ์ชฝ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ ํํ๊ฐ ๋๋ค.
์ํ ์๊ฐ
AVL ํธ๋ฆฌ์์์ ํ์, ์ฝ์ , ์ญ์ ์ฐ์ฐ์ ๊ณตํต์ ์ผ๋ก ๋ฃจํธ๋ถํฐ ํ์์ ์์ํ์ฌ ์ต์ ์ ๊ฒฝ์ฐ์ ์ดํ๋ฆฌ๊น์ง ๋ด๋ ค๊ฐ๊ณ , ์ฝ์ ์ด๋ ์ญ์ ์ฐ์ฐ์ ๋ค์ ๋ฃจํธ๊น์ง ๊ฑฐ์ฌ๋ฌ ์ฌ๋ผ๊ฐ์ผํ๋ค.
์ด๋ฌํ ํน์ง ๋๋ฌธ์ ์ ์ผ ์ฒ์ ๋งํ๋ ๊ฒ์ฒ๋ผ ํ์, ์ฝ์ , ์ญ์ ์ฐ์ฐ์ ์ํ ์๊ฐ์ ๊ฐ๊ฐ AVL ํธ๋ฆฌ์ ๋์ด์ ๋น๋กํ๋ค๊ณ ํ๋ ๊ฒ์ด๋ค. : O(logN)
ํธ๋ฆฌ๋ฅผ 1์ธต ๋ด๋ ค๊ฐ ๋๋ ์ํ ํธ์ถํ๋ฉฐ, 1์ธต์ ์ฌ๋ผ๊ฐ ๋, ๋ถ๊ท ํ์ด ๋ฐ์ํ๋ฉด ์ ์ ํ ํ์ ์ฐ์ฐ์ ์ํํ๋ค. ๊ฐ๊ฐ์ O(1)์ ์๊ฐ์ด ์์๋๋ค.
๋ค์ํ ์คํ ๊ฒฐ๊ณผ์ ๋ฐ๋ฅด๋ฉด AVL ํธ๋ฆฌ๋ ๊ฑฐ์ ์ ๋ ฌ๋ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ํ ํ์ ๋๋ค ์์๋ก ๋ฐ์ดํฐ๋ฅผ ํ์ํ๋ ๊ฒฝ์ฐ, ๊ฐ์ฅ ์ข์ ์ฑ๋ฅ์ ๋ณด์ธ๋ค.
๋ฐ๋๋ก ์ด์ง ํ์ ํธ๋ฆฌ๋ ๋๋ค ์์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ํ ํ์ ๋๋ค ์์๋ก ๋ฐ์ดํฐ๋ฅผ ํ์ํ๋ ๊ฒฝ์ฐ ๊ฐ์ฅ ์ข์ ์ฑ๋ฅ์ ๋ณด์ธ๋ค.