ํŠธ๋ฆฌ 3 (๊ท ํ˜• ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ)

8/27/2025

์‚ญ์ œ

์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ์—์„œ ๋…ธ๋“œ์˜ ์‚ญ์ œ ์—ฐ์‚ฐ์€ ๋‹ค๋ฅธ๊ฒƒ๋ณด๋‹ค ๋ณต์žกํ•˜๋‹ค.
์™œ๋ƒํ•˜๋ฉด ์‚ญ์ œํ•œ ๋…ธ๋“œ๊ฐ€ ์ž์‹์ด ์žˆ๋Š” ๊ฒฝ์šฐ ๊ทธ ์ž์‹๋“ค์„ ๋ฒ„๋ฆฌ์ง€ ์•Š์œผ๋ฉด์„œ ๋‹ค์‹œ ์žฌ๋ฐฐ์น˜ ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ.

         8
    4        12
  2   6    10   14
 1 3 5 7  9 11 13 15
0

(์œ„์—๋Š” ์–ด๋–ค ์ด์ง„ ํŠธ๋ฆฌ์ผ๊นŒ? ์™„์ „complete ์ด์ง„ ํŠธ๋ฆฌ.)

์–ด๋–ค ๋…ธ๋“œ๋ฅผ ์‚ญ์ œํ•  ๋•Œ์—๋Š” ์„ธ ๊ฐ€์ง€ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์„๊ฒƒ์ด๋‹ค.

  1. ์ž์‹ ๋…ธ๋“œ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ
  2. ์ž์‹ ๋…ธ๋“œ๊ฐ€ ํ•˜๋‚˜ ์žˆ๋Š” ๊ฒฝ์šฐ
  3. ์ž์‹ ๋…ธ๋“œ๊ฐ€ ๋‘˜ ์žˆ๋Š” ๊ฒฝ์šฐ

์ž์‹ ๋…ธ๋“œ ์—†์Œ

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 ์ดํ•˜์ด์—ฌ์•ผ ํ•œ๋‹ค.
์ด๋ ‡๊ฒŒ ๋˜๋ฉด ํ•ญ์ƒ O(logn)O(logn)์ •๋„์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ํ†ตํ•ด ํŠธ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒ, ์ˆ˜์ •์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ ์ด์ง„ ํŠธ๋ฆฌ์™€ ํฌ๊ฒŒ ๋‹ค๋ฅธ๊ฒƒ์€ ์—†๋Š”๋ฐ, ์ด์ง„ํŠธ๋ฆฌ์—์„œ ์ž๋ฃŒ๋ฅผ ์‚ฝ์ž…ํ•˜๊ณ  ์‚ญ์ œํ•  ๋•Œ ๊ฒฝ์‚ฌ ํŠธ๋ฆฌ๊ฐ€ ๋งŒ๋“ค์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์— ์‚ฝ์ž…๊ณผ ์‚ญ์ œ ๊ณผ์ •์— ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์›๋ž˜ ํ•œ ๋…ธ๋“œ์—๋Š” data, left, right๋ผ๋Š” ๋ฉค๋ฒ„๊ฐ€ ์žˆ๋Š”๋ฐ ์—ฌ๊ธฐ์— height๋ผ๋Š” ๋†’์ด๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋Š” ์†์„ฑ๋„ ์ถ”๊ฐ€ํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.

ํšŒ์ „

์‚ฝ์ž… ํ˜น์€ ์‚ญ์ œ ํ›„์— AVL์˜ ์กฐ๊ฑด (k๊ฐ€ 1 ์ดํ•˜์ผ ๊ฒƒ)์ด ์œ„๋ฐฐ๋œ๋‹ค๋ฉด 'ํšŒ์ „'์ด๋ผ๋Š” ๊ณผ์ •์„ ํ†ตํ•ด ํŠธ๋ฆฌ๋ฅผ ๋‹ค์‹œ ์ •๋ ฌํ•œ๋‹ค.
์ด์— ๋Œ€ํ•ด์„œ๋Š” ๋‹ค์Œ ์‹œ๊ฐ„์— ๋‹ค๋ฃฌ๋‹ค.