CS/Data Structure

[python] ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ (binary Search tree) - 1. ํด๋ž˜์Šค ์ •์˜, ์ดˆ๊ธฐํ™”, ๋…ธ๋“œ ์ถ”๊ฐ€

deo2kim 2020. 9. 2. 20:13
๋ฐ˜์‘ํ˜•

๐Ÿ“— ์ด์ง„ ํŠธ๋ฆฌ (binary Search tree)

 

๐Ÿ”ต ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ ํด๋ž˜์Šค ์ •์˜ ๋ฐ ์ดˆ๊ธฐํ™”

 

 ๋จผ์ €  Node  ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•ด ๋ณด์ž.   Node  ํด๋ž˜์Šค๋Š” ๋…ธ๋“œ๊ฐ’์ธ  self.val  ์™€ ์™ผ์ชฝ ๋…ธ๋“œ  self.left  ์˜ค๋ฅธ์ชฝ  ๋…ธ๋“œ   self.right  ์˜ ์†์„ฑ์„ ๊ฐ€์ง„๋‹ค. ์ดˆ๊ธฐํ™” ์‹œ Node๊ฐ’๋งŒ ์ฃผ์–ด์ง€๊ณ  ์™ผ์ชฝ, ์˜ค๋ฅธ์ชฝ ๋…ธ๋“œ๋Š” ๋น„์–ด์žˆ๋‹ค.

 

- ๋…ธ๋“œ ๊ตฌ์„ฑ

# ๋…ธ๋“œ ๋งŒ๋“ค๊ธฐ
#       A(val)
#      /      \
# B(left)     C(right)

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

 

 Node  ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค๋ฉด,  BinaryTree  ๋ฅผ ๋งŒ๋“ค์–ด๋ณด์ž. ์ฒ˜์Œ์—๋Š” Node์˜ ๊ฐ’์ด ์—†๋Š”, ๋…ธ๋“œ ํ•˜๋‚˜๋ฅผ ๊ฐ€์ง„ ํŠธ๋ฆฌ๋กœ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.

- ํŠธ๋ฆฌ ๊ตฌ์„ฑ

 

class BinaryTree:
    # ์ดˆ๊ธฐ๊ฐ’ head๋Š” None
    def __init__(self):
        self.head = Node(None)

        self.preorder_list=[]
        self.inorder_list=[]
        self.postorder_list=[]
        

 

์ด์ œ ์—ฌ๊ธฐ์— ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œ, ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ฉ”์†Œ๋“œ๋ฅผ ์ •์˜ ์ฃผ์–ด์•ผ ํ•œ๋‹ค.

 

๐Ÿ”ต ์ถ”๊ฐ€ / add

 

 ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋Š” ์žฌ๊ท€๋ฅผ ์ด์šฉํ•ด์„œ ๊ตฌํ˜„ํ•˜๋ฉด ๋œ๋‹ค.  item  ๊ฐ’์„ ์ถ”๊ฐ€ํ–ˆ์„ ๋•Œ ๋…ธ๋“œ์˜ ๊ฐ’์ด  None  ์ด๋ผ๋ฉด ๋…ธ๋“œ์˜ ๊ฐ’์„  item  ์œผ๋กœ ํ•œ๋‹ค. ๋…ธ๋“œ์˜ ๊ฐ’์ด ์žˆ๋‹ค๋ฉด ๋Œ€์†Œ ๋น„๊ต๋ฅผ ํ†ตํ•ด ๋…ธ๋“œ์˜ ์™ผ์ชฝ์œผ๋กœ ๊ฐˆ ๊ฒƒ์ธ์ง€, ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๊ฐˆ ๊ฒƒ์ธ์ง€ ๊ฒฐ์ •ํ•˜๋ฉฐ, ์žฌ๊ท€์ ์œผ๋กœ ๋์— ๋„๋‹ฌํ•˜์—ฌ ๊ฐ’์„ ์ถ”๊ฐ€ํ•˜๊ฒŒ ๋œ๋‹ค.

class BinaryTree:
    # ์ดˆ๊ธฐ๊ฐ’ head๋Š” None
    def __init__(self):...

    # ๊ฐ’ ์ถ”๊ฐ€ํ•˜๊ธฐ head๊ฐ€ ์—†์„ ๊ฒฝ์šฐ
    def add(self, item):
        if self.head.val is None:
            self.head.val = item

        # head๊ฐ€ ์žˆ์œผ๋ฉด ์™ผ์ชฝ๋ฐฐ์น˜ or ์˜ค๋ฅธ์ชฝ๋ฐฐ์น˜
        else:
            self.__add_node(self.head, item)

    # head๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ
    def __add_node(self, cur, item):
        print('๋ถ€๋ชจ:', cur.val, '์ž์‹:', item)
        # head ๊ฐ’์ด ํฌ๋ฉด ์™ผ์ชฝ์œผ๋กœ
        if cur.val >= item:
            if cur.left is not None:
                self.__add_node(cur.left, item)
            else:
                cur.left = Node(item)
        # head ๊ฐ’์ด ์ž‘์œผ๋ฉด ์˜ค๋ฅธ์ชฝ์œผ๋กœ
        else:
            if cur.right is not None:
                self.__add_node(cur.right, item)
            else:
                cur.right = Node(item)

 

 

๋ฐ˜์‘ํ˜•