์ญ์
์ด์ง ๊ฒ์ ํธ๋ฆฌ์์ ๋
ธ๋์ ์ญ์ ์ฐ์ฐ์ ๋ค๋ฅธ๊ฒ๋ณด๋ค ๋ณต์กํ๋ค.
์๋ํ๋ฉด ์ญ์ ํ ๋
ธ๋๊ฐ ์์์ด ์๋ ๊ฒฝ์ฐ ๊ทธ ์์๋ค์ ๋ฒ๋ฆฌ์ง ์์ผ๋ฉด์ ๋ค์ ์ฌ๋ฐฐ์น ํด์ผ ํ๊ธฐ ๋๋ฌธ.
8
4 12
2 6 10 14
1 3 5 7 9 11 13 15
0
(์์๋ ์ด๋ค ์ด์ง ํธ๋ฆฌ์ผ๊น? ์์ complete ์ด์ง ํธ๋ฆฌ.)
์ด๋ค ๋ ธ๋๋ฅผ ์ญ์ ํ ๋์๋ ์ธ ๊ฐ์ง ๊ฒฝ์ฐ๊ฐ ์์๊ฒ์ด๋ค.
- ์์ ๋ ธ๋๊ฐ ์๋ ๊ฒฝ์ฐ
- ์์ ๋ ธ๋๊ฐ ํ๋ ์๋ ๊ฒฝ์ฐ
- ์์ ๋ ธ๋๊ฐ ๋ ์๋ ๊ฒฝ์ฐ
์์ ๋ ธ๋ ์์
node.left
์ node.right
๋ชจ๋๊ฐ null ์ธ ๊ฒฝ์ฐ
์์ ํธ๋ฆฌ์์ 9๋ฅผ ์ง์ฐ๋ ค๊ณ ํ๋ค๋ฉด
๊ทธ ๋ถ๋ชจ์ธ 10์์ left
๋ฅผ null๋ก ๋ฐ๊ฟ์ค๋ค.
์์ ๋ ธ๋ 1๊ฐ
node.left
๋ง ์๋ ๊ฒฝ์ฐ
์์ ํธ๋ฆฌ์์ 1์ ์ง์ฐ๋ ค๋ฉด 1์ ๋ถ๋ชจ์ธ 2์ 1์ ์์์ธ 0์ ์ด์ด์ค์ผ ํ๋ค.
์์ ๋ ธ๋ 2๊ฐ
์์ ํธ๋ฆฌ์์ 4๋ฅผ ์ง์ฐ๋ ค๋ฉด?
8์ left์ 2๋ 6์ค์ ํ๋๋ฅผ ๋ฃ์ด์ผํ๋? ๊ทธ๋ฐ๋ฐ ์ด๋ ๊ฒ ํ ์ ์๋๊ฒ 2์ 6 ๋ชจ๋ ์์ ๋
ธ๋๋ฅผ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ ๊ผฌ์ฌ๋ฒ๋ฆฐ๋ค.
๊ทธ๋์ ๋จผ์
์ง์ฐ๋ ค๊ณ ํ๋ ๋
ธ๋์ ๊ฐ ๋ณด๋ค ํฐ ๊ฒ ์ค์ ๊ฐ์ ์์๊ฒ (ํ์๋
ธ๋)๋ฅผ ์ฐพ๋๋ค. ์ฌ๊ธฐ์๋ 5.
๊ทธ๋ฆฌ๊ณ (์ผ๋จ) ์ด 5๋ฅผ 8์ left๋ก ์ฐ๊ฒฐํด์ค๋ค.
8
5 12
2 6
1 3 5 7
0
์ด๋ ๊ฒ ๋๋ฉด ๋ฌธ์ ๊ฐ 5๊ฐ ์ค์ฒฉ๋๋ค๋ ์ .
์ด๊ฑธ ํด๊ฒฐํ๊ธฐ ์ํด ๋ค์ 5์ ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ์์ 5์ ์ผ์นํ๋ ๋
ธ๋๋ฅผ ์ง์์ฃผ๋ฉด ๋๋ค.
js ์ฝ๋
remove(data) {
this.root = this.removeNode(this.root, data);
}
removeNode(node, data) {
// 1.
if (!node) return null;
// 2. ๋
ธ๋ ์ฐพ๊ธฐ
if (data < node.data) {
node.left = this.removeNode(node.left, data);
return node;
}
if (data > node.data) {
node.right = this.removeNode(node.right, data);
return node;
}
// 3. ๋
ธ๋ ์ฐพ์
// 1) ์์ 0
if (!node.left && !node.right) {
return null;
}
// 2) ์์ 1
if (!node.left) {
return node.right;
}
if (!node.right) {
return node.left;
}
// * 3) ์์ 2
const temp = this.findMin(node.right);
node.data = temp.data;
node.right = this.removeNode(node.right, temp.data);
return node;
}
findMin(node) {
if (!node.left) {
return node;
}
return this.findMin(node.left);
}
๊ท ํ ์ด์ง ํธ๋ฆฌ Balanced
์ผ๋ฐ BST๊ฐ ๊ฐ์ง๋ ํฐ ๋จ์ ์ด ์๋ค.
๋ฐ๋ก ๋ฐ์ดํฐ๋ฅผ ์
๋ ฅํ ๋ ์๋ฌด๋ ๊ฒ๋ ๋ง๊ตฌ ์
๋ ฅํ๋ ๊ฒฝ์ฐ ๋งค์ฐ ๋น ํจ์จ์ ์ธ ๊ตฌ์กฐ๋ก ๋ง๋ค์ด์ง ์ ์๋ค.
[1,2,3,4,5]
์ด ์์๋๋ก ์๋ฃ๋ฅผ ์
๋ ฅํ๋ฉด ์ผ๋ฐ ๋งํฌ๋ ๋ฆฌ์คํธ์ ๋ค๋ฅผ๋ฐ๊ฐ ์ ํ ์๋ค.
๊ทธ๋์ ์ด๋ ๊ฒ ๊ฒฝ์ฌํธ๋ฆฌ๊ฐ ๋ง๋ค์ด์ง๋๊ฑธ ๋ฐฉ์งํ๊ธฐ ์ํด ๊ณ ์๋ ๊ฒ์ด ๊ท ํ ์ด์ง ํธ๋ฆฌ.
๊ทธ ์ค ๋ํ์ ์ธ ๊ฒ์ด AVL ํธ๋ฆฌ๋ค.
AVL ํธ๋ฆฌ์ ์์ฑ
๊ฐ ๋
ธ๋ ์ผ์ชฝ ์๋ธํธ๋ฆฌ์ ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ์ ๋์ด ์ฐจ์ด๋ฅผ k(balance factor)๋ผ๊ณ ํ๊ณ , ์ด k๊ฐ 1 ์ดํ์ด์ฌ์ผ ํ๋ค.
์ด๋ ๊ฒ ๋๋ฉด ํญ์ ์ ๋์ ์๊ฐ ๋ณต์ก๋๋ฅผ ํตํด ํธ๋ฆฌ ๋ฐ์ดํฐ๋ฅผ ์กฐํ, ์์ ์ ํ ์ ์๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ์ด์ง ํธ๋ฆฌ์ ํฌ๊ฒ ๋ค๋ฅธ๊ฒ์ ์๋๋ฐ, ์ด์งํธ๋ฆฌ์์ ์๋ฃ๋ฅผ ์ฝ์ ํ๊ณ ์ญ์ ํ ๋ ๊ฒฝ์ฌ ํธ๋ฆฌ๊ฐ ๋ง๋ค์ด์ง๊ธฐ ๋๋ฌธ์ ์ฝ์ ๊ณผ ์ญ์ ๊ณผ์ ์ ์ฐจ์ด๊ฐ ์๋ค.
๊ทธ๋ฆฌ๊ณ ์๋ ํ ๋
ธ๋์๋ data, left, right
๋ผ๋ ๋ฉค๋ฒ๊ฐ ์๋๋ฐ ์ฌ๊ธฐ์ height
๋ผ๋ ๋์ด๋ฅผ ์ ์ ์๋ ์์ฑ๋ ์ถ๊ฐํ๋ค๊ณ ํ๋ค.
ํ์
์ฝ์
ํน์ ์ญ์ ํ์ AVL์ ์กฐ๊ฑด (k๊ฐ 1 ์ดํ์ผ ๊ฒ)์ด ์๋ฐฐ๋๋ค๋ฉด 'ํ์ '์ด๋ผ๋ ๊ณผ์ ์ ํตํด ํธ๋ฆฌ๋ฅผ ๋ค์ ์ ๋ ฌํ๋ค.
์ด์ ๋ํด์๋ ๋ค์ ์๊ฐ์ ๋ค๋ฃฌ๋ค.