Data structures (with python) - 8.Tree - 8.2 Binary Search Tree

2024. 1. 9. 22:06ใ†CS - Roadmap.sh/1. Data structures

Data structures (with python) - 8.Tree - 8.2 Binary Search Tree

 

๐Ÿ’ก A binary search tree, also called an ordered or sorted binary tree, is a rooted binary tree data structure with the key of each internal node being greater than all the keys in the respective node’s left subtree and less than the ones in its right subtree.

์ •๋ ฌ๋œ ์ด์ง„ ํŠธ๋ฆฌ ๋˜๋Š” ์ •๋ ฌ๋œ ์ด์ง„ ํŠธ๋ฆฌ๋ผ๊ณ ๋„ ํ•˜๋Š” ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ๋Š” ๊ฐ ๋‚ด๋ถ€ ๋…ธ๋“œ์˜ ํ‚ค๊ฐ€ ํ•ด๋‹น ๋…ธ๋“œ์˜ ์™ผ์ชฝ ํ•˜์œ„ ํŠธ๋ฆฌ์— ์žˆ๋Š” ๋ชจ๋“  ํ‚ค๋ณด๋‹ค ํฌ๊ณ  ์˜ค๋ฅธ์ชฝ ํ•˜์œ„ ํŠธ๋ฆฌ์— ์žˆ๋Š” ํ‚ค๋ณด๋‹ค ์ž‘์€ ๋ฃจํŒ…๋œ ์ด์ง„ ํŠธ๋ฆฌ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.

 

8.1 binary tree ์— ์ด์–ด์„œ

Binary search tree ์ž…๋‹ˆ๋‹ค.

 

Binary Search Tree ๋Š” ์ด๋ฆ„์— ์™œ Search๊ฐ€ ๋“ค์–ด๊ฐ€ ์žˆ์„๊นŒ?

์ด๋ฆ„๋งŒ ๋ด์„œ๋Š” search ๊ฐ€ ์ค‘๊ฐ„์— ๋“ค์–ด๊ฐ€ ์žˆ๋Š”๋ฐ ๋ณด์ด๋“ฏ์ด, ์ด์ง„ํŠธ๋ฆฌ์˜ ํ•œ ์ข…๋ฅ˜์ด์ง€๋งŒ search ํ•˜๋Š”๋ฐ (ํŠน์ • ์กฐ๊ฑดํ•˜์—) ์žฅ์ ์ด ์žˆ์–ด์„œ ๋”ฐ๋กœ ๋ฐฐ์šด๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

์ด์ง„ํŠธ๋ฆฌ์˜ ์ •์˜๋Š” 8.1 ์—์„œ ๊ฐ ๋…ธ๋“œ๊ฐ€ ์ตœ๋Œ€ ๋‘๊ฐœ์˜ ์ž์‹ ๋…ธ๋“œ๋ฅผ ๊ฐ€์ง€๋Š” ํŠธ๋ฆฌ ๊ตฌ์กฐ์ด๋‹ค. ๋…ธ๋“œ์˜ ๋ฐฐ์น˜์— ์ œํ•œ์ด๋‚˜ ๊ทœ์น™์ด ์—†๋‹ค.

 

๋ฐ˜๋ฉด, ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ(์ดํ•˜ BST)์—์„œ๋Š” ๋…ธ๋“œ์˜ ๋ฐฐ์น˜์— ํŠน๋ณ„ํ•œ ๊ทœ์น™์ด ์žˆ๋‹ค.

BST์—์„œ๋Š” ๊ฐ ๋…ธ๋“œ์— ๋Œ€ํ•ด ๊ทธ ๋…ธ๋“œ์˜ ๊ฐ’์ด ์™ผ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ์˜ ๋ชจ๋“  ๋…ธ๋“œ์˜ ๊ฐ’๋ณด๋‹ค ํฌ๊ณ , ์˜ค๋ฅธ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ์˜ ๋ชจ๋“  ๋…ธ๋“œ์˜ ๊ฐ’๋ณด๋‹ค ์ž‘์•„์•ผ ํ•œ๋‹ค๋Š” ๊ทœ์น™์ด ์žˆ๋‹ค.

์ด ๊ทœ์น™ ๋•๋ถ„์— BST์—์„œ๋Š” ๊ฐ’์„ ๊ฒ€์ƒ‰ ํ•  ๋–„, ํ˜„์žฌ ๋…ธ๋“œ์˜ ๊ฐ’๊ณผ ์ฐพ๊ณ ์ž ํ•˜๋Š” ๊ฐ’์„ ๋น„๊ตํ•˜์—ฌ ์™ผ์ชฝ or ์˜ค๋ฅธ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ๋กœ ์ด๋™ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

๋”ฐ๋ผ์„œ BST๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ด์œ ๋กœ 'Search'๊ฐ€ ์ด๋ฆ„์— ํ‘œํ•จ ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

BST์˜ ํŠน์ง•

- ๊ฐ ๋…ธ๋“œ์˜ ํ‚ค๋Š” ๊ณ ์œ 

- ์™ผ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ์˜ ๋ชจ๋“  ๋…ธ๋“œ์˜ ํ‚ค๋Š” ๊ทธ ๋ฃจํŠธ์˜ ํ‚ค๋ณด๋‹ค ์ž‘๋‹ค.

- ์˜ค๋ฅธ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ์˜ ๋ชจ๋“  ๋…ธ๋“œ์˜ ํ‚ค๋Š” ๊ทธ ๋ฃจํŠธ์˜ ํ‚ค๋ณด๋‹ค ํฌ๋‹ค.

- ์™ผ์ชฝ, ์˜ค๋ฅธ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ๋„ ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ์ด๋‹ค.

 

์ด๋Ÿฌํ•œ ํŠน์ง• ๋•๋ถ„์—, BST๋Š” ๊ฒ€์ƒ‰, ์‚ฝ์ž…, ์‚ญ์ œ ๋“ฑ์˜ ์—ฐ์‚ฐ์„ ํšจ์œจ์ €๊ธ๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ‰๊ท ์ €๊ธ๋กœ ์ด๋Ÿฌํ•œ ์—ฐ์‚ฐ๋“ค์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(log N) ์ž…๋‹ˆ๋‹ค.

 

In Python

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

 

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

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

    def insert(self, key):
        if self.root is None:
            self.root = Node(key)
        else:
            self._insert(self.root, key)

    def _insert(self, node, key):
        if key < node.key:
            if node.left is None:
                node.left = Node(key)
            else:
                self._insert(node.left, key)
        else:
            if node.right is None:
                node.right = Node(key)
            else:
                self._insert(node.right, key)

    def search(self, key):
        return self._search(self.root, key)

    def _search(self, node, key):
        if node is None or node.key == key:
            return node
        if key < node.key:
            return self._search(node.left, key)
        return self._search(node.right, key)

 

BST ํด๋ž˜์Šค๋Š” BST์˜ ๋ฃจํŠธ ๋…ธ๋“œ๋ฅผ ์ €์žฅํ•˜๋ฉฐ,

insert ๋ฉ”์†Œ๋“œ์™€ search ๋ฉ”์†Œ๋“œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

 

Insert ๋ฉ”์†Œ๋“œ๋Š” ์ƒˆ๋กœ์šด ํ‚ค๋ฅผ ์‚ฝ์ž…, search ๋ฉ”์†Œ๋“œ๋Š” ์ฃผ์–ด์ง„ ํ‚ค๋ฅผ ๊ฐ€์ง„ ๋…ธ๋“œ๋ฅผ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ฉ”์†Œ๋“ค๋“ค์€ _insert , _search ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ์žฌ๊ท€์ ์œผ๋กœ ์ž‘๋™ํ•œ๋‹ค.

 

BST๋Š” ์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์œ„์˜ ์ฝ”๋“œ๋Š” ๊ท ํ˜• ์žกํžŒ ํŠธ๋ฆฌ๋ฅผ ์œ ์ง€ํ•˜์ง€ ๋ชปํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ตœ์•…์˜ ๊ฒฝ์šฐ ํŠธ๋ฆฌ๊ฐ€ ํ•œ ์ชฝ์œผ๋กœ ์น˜์šฐ์ณ์ ธ์„œ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ O(n)์ด ๋  ์ˆ˜ ์žˆ๋‹ค.

 

์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” AVL ํŠธ๋ฆฌ๋‚˜ ๋ ˆ๋“œ-๋ธ”๋ž™ ํŠธ๋ฆฌ ๋“ฑ์˜ ๊ท ํ˜• ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

(๊ท ํ˜• ๊ฒ€์ƒ‰ํŠธ๋ฆฌ๋Š” ์ฐจํ›„ ๋‹ค๋ฃฌ๋‹ค.)

728x90