Data structures (with python) - 8.Tree - 8.5 Balanced Tree

2024. 1. 11. 22:36ใ†CS - Roadmap.sh/1. Data structures

Data structures (with python) - 8.Tree - 8.5 Balanced Tree

 

๐Ÿ’ก A balanced binary tree, also referred to as a height-balanced binary tree, is defined as a binary tree in which the height of the left and right subtree of any node differ by not more than 1.

๋†’์ด-๊ท ํ˜• ์ด์ง„ ํŠธ๋ฆฌ๋ผ๊ณ ๋„ ํ•˜๋Š” ๊ท ํ˜• ์ด์ง„ ํŠธ๋ฆฌ๋Š” ๋ชจ๋“  ๋…ธ๋“œ์˜ ์™ผ์ชฝ๊ณผ ์˜ค๋ฅธ์ชฝ ํ•˜์œ„ ํŠธ๋ฆฌ์˜ ๋†’์ด๊ฐ€ 1 ์ดํ•˜๋กœ ์ฐจ์ด๊ฐ€ ๋‚˜๋Š” ์ด์ง„ ํŠธ๋ฆฌ๋กœ ์ •์˜๋ฉ๋‹ˆ๋‹ค.

 

๊ท ํ˜•ํŠธ๋ฆฌ(Balanced Tree)์— ๋Œ€ํ•ด ์•Œ์•„๋ด…์‹œ๋‹ค.

 

๊ท ํ˜• ํŠธ๋ฆฌ๋Š” ๋ชจ๋“  ๋…ธ๋“œ์˜ ์™ผ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ์™€ ์˜ค๋ฅธ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ์˜ ๋†’์ด ์ฐจ๊ฐ€ ์ตœ๋Œ€ 1์ธ ํŠน์ง•์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

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

์ด๋Ÿฌํ•œ ๊ท ํ˜• ํŠธ๋ฆฌ์˜ ์˜ˆ๋กœ๋Š” AVL ํŠธ๋ฆฌ, ๋ ˆ๋“œ-๋ธ”๋ž™ ํŠธ๋ฆฌ ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

In Python

AVL ํŠธ๋ฆฌ๋ฅผ ์˜ˆ๋กœ ํŒŒ์ด์ฌ์—์„œ ๋ฐธ๋Ÿฐ์Šค๋“œ ํŠธ๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

(AVL ํŠธ๋ฆฌ๋Š” ์ž์ฒด ๊ท ํ˜•์„ ์œ ์ง€ํ•˜๋Š” ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ์˜ํ•œ ์ข…๋ฅ˜์ž…๋‹ˆ๋‹ค.)

 

class Node:
    def __init__(self, key):
        self.key = key
        self.left = None
        self.right = None
        self.height = 1

class AVLTree:
    def __init__(self):
        self.root = None

    def insert(self, key):
        # ์ฝ”๋“œ ์ƒ๋žต...

    def delete(self, key):
        # ์ฝ”๋“œ ์ƒ๋žต...

    def search(self, key):
        # ์ฝ”๋“œ ์ƒ๋žต...

    # ์ถ”๊ฐ€์ ์ธ ๋ฉ”์†Œ๋“œ(ํšŒ์ „, ๋†’์ด ๊ณ„์‚ฐ, ๊ท ํ˜• ๊ณ„์‚ฐ ๋“ฑ)...

์ด๋Ÿฐ ํ˜•์‹์œผ๋กœ ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค.

 

์ƒ๋žต๋œ ๋ถ€๋ถ„์„ ์ •๋ง ์˜ˆ์‹œ๋ฅผ ๋“ค์–ด๋ณธ๋‹ค๋ฉด,

์‚ฝ์ž… (insert) ๋ฉ”์†Œ๋“œ๋ฅผ ๋จผ์ € ์˜ˆ์‹œ๋กœ ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

def insert(self, root, key):
    if not root:
        return Node(key)
    elif key < root.key:
        root.left = self.insert(root.left, key)
    else:
        root.right = self.insert(root.right, key)

    root.height = 1 + max(self.getHeight(root.left),
                          self.getHeight(root.right))

    balance = self.getBalance(root)

    if balance > 1:
        if key < root.left.key:
            return self.rightRotate(root)
        else:
            root.left = self.leftRotate(root.left)
            return self.rightRotate(root)

    if balance < -1:
        if key > root.right.key:
            return self.leftRotate(root)
        else:
            root.right = self.rightRotate(root.right)
            return self.leftRotate(root)

    return root

์œ„์ฝ”๋“œ์—์„œ ๋จผ์ € ์ด์ง„ํƒ์ƒ‰ํŠธ๋ฆฌ์˜ ์‚ฝ์ž… ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•œ ๋’ค,

๋†’์ด๋ฅผ ๊ฐฑ์‹ ํ•˜๊ณ  ๊ท ํ˜•์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

if balance ๋ฅผ ํ†ตํ•ด ๊ท ํ˜•์ด ๊บ ์ง€๋Š” ๊ฒฝ์šฐ,

์ ์ ˆํ•œ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ๊ท ํ˜•์„ ๋ณต์›ํ•ฉ๋‹ˆ๋‹ค.

 

์‚ญ์ œ(delete)

def delete(self, root, key):
    if not root:
        return root

    elif key < root.key:
        root.left = self.delete(root.left, key)

    elif key > root.key:
        root.right = self.delete(root.right, key)

    else:
        if root.left is None:
            temp = root.right
            root = None
            return temp

        elif root.right is None:
            temp = root.left
            root = None
            return temp

        temp = self.getMinValueNode(root.right)
        root.key = temp.key
        root.right = self.delete(root.right,
                                  temp.key)

    if root is None:
        return root

    root.height = 1 + max(self.getHeight(root.left),
                          self.getHeight(root.right))

    balance = self.getBalance(root)

    if balance > 1:
        if self.getBalance(root.left) >= 0:
            return self.rightRotate(root)
        else:
            root.left = self.leftRotate(root.left)
            return self.rightRotate(root)

    if balance < -1:
        if self.getBalance(root.right) <= 0:
            return self.leftRotate(root)
        else:
            root.right = self.rightRotate(root.right)
            return self.leftRotate(root)

    return root

 

1. ๋จผ์ € ์‚ญ์ œํ•  ํ‚ค๋ฅผ ๊ฐ€์ง„ ๋…ธ๋“œ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.

์ด๋•Œ ํ‚ค๊ฐ€ ๋ฃจํŠธ ๋…ธ๋“œ์˜ ํ‚ค๋ณด๋‹ค ์ž‘์œผ๋ฉด ์™ผ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ์—์„œ ์ฐพ๊ณ , ํฌ๋ฉด ์˜ค๋ฅธ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ์—์„œ ์ฐพ์Šต๋‹ˆ๋‹ค.

(elif key )

 

2. ํ‚ค๋ฅผ ์ฐพ์•˜๋‹ค๋ฉด, ํ•ด๋‹น ๋…ธ๋“œ๋ฅต ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

- ์‚ญ์ œํ•  ๋…ธ๋“œ๊ฐ€ ์ž์‹ ๋…ธ๋“œ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ: ๊ทธ๋ƒฅ ์‚ญ์ œ

- ์‚ญ์ œํ•  ๋…ธ๋“œ๊ฐ€ ํ•œ ๊ฐœ์˜ ์ž์‹ ๋…ธ๋“œ๋ฅผ ๊ฐ€์ง€๋Š” ๊ฒฝ์šฐ : ์‚ญ์ œํ•  ๋…ธ๋“œ๋ฅผ ๊ทธ ์ž์‹ ๋…ธ๋“œ๋กœ ๋Œ€์ฒด

- ์‚ญ์ œํ•  ๋…ธ๋“œ๊ฐ€ ๋‘ ๊ฐœ์˜ ์ž์‹ ๋…ธ๋“œ๋ฅผ ๊ฐ€์ง€๋Š” ๊ฒฝ์šฐ : ์‚ญ์ œํ•  ๋…ธ๋“œ์˜ ์˜ค๋ฅธ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ์—์„œ ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์„ ๊ฐ€์ง„ ๋…ธ๋“œ

(์ฆ‰, ์˜ค๋ฅธ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ์˜ ๊ฐ€์žฅ ์™ผ์ชพ ๋…ธ๋“œ)๋ฅผ ์ฐพ์•„์„œ ์‚ญ์ œํ•  ๋…ธ๋“œ์˜ ์œ„์น˜์— ๋†“๊ณ , ๊ทธ ๋…ธ๋“œ๋ฅผ ์˜ค๋ฅธ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ์—์„œ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

 

3. ๋…ธ๋“œ๋ฅผ ์‚ญ์ œํ•œ ํ›„์—๋Š” ๋†’์ด๋ฅผ ๊ฐฑ์‹ , ๊ท ํ˜•์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

๊ท ํ˜•์ด ๊นจ์ง€๋Š” ๊ฒฝ์šฐ, ์ ์ ˆํ•œ ํšŒ์ „ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ๊ท ํ˜•์„ ๋ณต์›ํ•ฉ๋‹ˆ๋‹ค.

ํšŒ์ „์—ฐ์‚ฐ์€ ์‚ฝ์ž…์—ฐ์‚ฐ ๋•Œ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, ๊ท ํ˜•์ด ๊บ ์ง„ ๋…ธ๋“œ์˜ ์ƒํƒœ์— ๋”ฐ๋ผ ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค.

 

 

AVL ํŠธ๋ฆฌ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ํด๋ž˜์Šค๋ฅผ ์•Œ์•„๋ณด์•˜์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๊ท ํ˜• ํŠธ๋ฆฌ๋Š” ํƒ์ƒ‰, ์‚ฝ์ž…, ์‚ญ์ œ์—ฐ์‚ฐ์„ ๋น ๋ฅด๊ฒŒ ์ˆ˜ํ–‰ํ• ์ˆ˜ ์žˆ์–ด ๋‹ค์–‘ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋กœ, DB ์‹œ์Šคํ…œ์—์„œ ๋น ๋ฅธ ํƒ์ƒ‰ ์†๋„๋ฅผ ๋ณด์žฅํ•˜๊ธฐ์œ„ํ•ด ์ด๋Ÿฌํ•œ ๊ท ํ˜• ํŠธ๋ฆฌ๋ฅผ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

 

 

Appendix

ํšŒ์ „์—ฐ์‚ฐ์ด ๋ญ”๋ฐ?

 

๊ท ํ˜• ํŠธ๋ฆฌ๋ฅผ ์„ค๋ช…ํ• ๋•Œ ํƒ์ƒ‰ํ›„ ๊ท ํ˜•์ด ์•ˆ๋งž์œผ๋ฉด ํšŒ์ „์—ฐ์‚ฐ์„ ํ†ตํ•˜์—ฌ ๊ท ํ˜•์„ ๋ณต๊ตฌํ•œ๋‹ค๊ณ  ๋งํ•˜์˜€์Šต๋‹ˆ๋‹ค.

ํšŒ์ „์—ฐ์‚ฐ์€ ๋ญ˜๊นŒ์š”?

 

ํšŒ์ „ ์—ฐ์‚ฐ์€ AVL ํŠธ๋ฆฌ๊ฐ€ ๊ท ํ˜•์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ์—ฐ์‚ฐ์ž…๋‹ˆ๋‹ค. 

AVL ํŠธ๋ฆฌ์—์„œ๋Š” ์‚ฝ์ž…์ด๋‚˜ ์‚ญ์ œ ์—ฐ์‚ฐ์ด ์ด๋ฃจ์–ด์งˆ ๋•Œ๋งˆ๋‹ค ํŠธ๋ฆฌ์˜ ๊ท ํ˜•์„ ํ™•์ธํ•˜๊ณ , ํ•„์š”ํ•œ ๊ฒฝ์šฐ ํšŒ์ „ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ๊ท ํ˜•์„ ๋ณต์›ํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ ํšŒ์ „์€ ํฌ๊ฒŒ ์™ผ์ชฝ ํšŒ์ „๊ณผ ์˜ค๋ฅธ์ชฝ ํšŒ์ „, ๊ทธ๋ฆฌ๊ณ  ์ด๋ฅผ ์กฐํ•ฉํ•œ ์™ผ์ชฝ-์˜ค๋ฅธ์ชฝ ํšŒ์ „๊ณผ ์˜ค๋ฅธ์ชฝ-์™ผ์ชฝ ํšŒ์ „์œผ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์™ผ์ชฝ ํšŒ์ „: ๋…ธ๋“œ์˜ ์˜ค๋ฅธ์ชฝ ์ž์‹์ด ๋ถ€๋ชจ๊ฐ€ ๋˜๊ณ , ์›๋ž˜์˜ ๋…ธ๋“œ๋Š” ๊ทธ ์ž์‹์˜ ์™ผ์ชฝ ์ž์‹์ด ๋ฉ๋‹ˆ๋‹ค. ์ด ์—ฐ์‚ฐ์€ ๋…ธ๋“œ์˜ ์˜ค๋ฅธ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ์˜ ๋†’์ด๊ฐ€ ๋„ˆ๋ฌด ๋†’์•„์ ธ ๊ท ํ˜•์ด ๊นจ์กŒ์„ ๋•Œ ์‚ฌ์šฉํ•˜๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ์˜ค๋ฅธ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ์˜ ๋†’์ด๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


์˜ค๋ฅธ์ชฝ ํšŒ์ „: ๋…ธ๋“œ์˜ ์™ผ์ชฝ ์ž์‹์ด ๋ถ€๋ชจ๊ฐ€ ๋˜๊ณ , ์›๋ž˜์˜ ๋…ธ๋“œ๋Š” ๊ทธ ์ž์‹์˜ ์˜ค๋ฅธ์ชฝ ์ž์‹์ด ๋ฉ๋‹ˆ๋‹ค. ์ด ์—ฐ์‚ฐ์€ ๋…ธ๋“œ์˜ ์™ผ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ์˜ ๋†’์ด๊ฐ€ ๋„ˆ๋ฌด ๋†’์•„์ ธ ๊ท ํ˜•์ด ๊นจ์กŒ์„ ๋•Œ ์‚ฌ์šฉํ•˜๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ์™ผ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ์˜ ๋†’์ด๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


์™ผ์ชฝ-์˜ค๋ฅธ์ชฝ ํšŒ์ „: ๋…ธ๋“œ์˜ ์™ผ์ชฝ ์ž์‹์— ๋Œ€ํ•ด ์™ผ์ชฝ ํšŒ์ „์„ ์ˆ˜ํ–‰ํ•œ ํ›„, ๋…ธ๋“œ์— ๋Œ€ํ•ด ์˜ค๋ฅธ์ชฝ ํšŒ์ „์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด ์—ฐ์‚ฐ์€ ๋…ธ๋“œ์˜ ์™ผ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ์˜ ๋†’์ด๊ฐ€ ๋†’์•„์ง„ ์ƒํƒœ์—์„œ, ๊ทธ ์„œ๋ธŒํŠธ๋ฆฌ์˜ ์˜ค๋ฅธ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ์˜ ๋†’์ด๊ฐ€ ๋„ˆ๋ฌด ๋†’์•„์ ธ ๊ท ํ˜•์ด ๊นจ์กŒ์„ ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.


์˜ค๋ฅธ์ชฝ-์™ผ์ชฝ ํšŒ์ „: ๋…ธ๋“œ์˜ ์˜ค๋ฅธ์ชฝ ์ž์‹์— ๋Œ€ํ•ด ์˜ค๋ฅธ์ชฝ ํšŒ์ „์„ ์ˆ˜ํ–‰ํ•œ ํ›„, ๋…ธ๋“œ์— ๋Œ€ํ•ด ์™ผ์ชฝ ํšŒ์ „์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด ์—ฐ์‚ฐ์€ ๋…ธ๋“œ์˜ ์˜ค๋ฅธ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ์˜ ๋†’์ด๊ฐ€ ๋†’์•„์ง„ ์ƒํƒœ์—์„œ, ๊ทธ ์„œ๋ธŒํŠธ๋ฆฌ์˜ ์™ผ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ์˜ ๋†’์ด๊ฐ€ ๋„ˆ๋ฌด ๋†’์•„์ ธ ๊ท ํ˜•์ด ๊นจ์กŒ์„ ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.


์ด๋Ÿฌํ•œ ํšŒ์ „ ์—ฐ์‚ฐ๋“ค์€ AVL ํŠธ๋ฆฌ์˜ ๊ท ํ˜•์„ ์œ ์ง€ํ•˜๋Š” ๋ฐ ํ•ต์‹ฌ์ ์ธ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ํšŒ์ „ ์—ฐ์‚ฐ์„ ํ†ตํ•ด AVL ํŠธ๋ฆฌ๋Š” ๋ชจ๋“  ๋…ธ๋“œ์—์„œ ์™ผ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ์™€ ์˜ค๋ฅธ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ์˜ ๋†’์ด ์ฐจ๊ฐ€ ๋งŽ์•„์•ผ 1์ด ๋˜๋„๋ก ๊ท ํ˜•์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

 

ํ•œ๋งˆ๋””๋กœ,

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

728x90