๐Ÿ“•Week1 day2(17-19)

๋ฐ•์ค€ํฌยท2023๋…„ 8์›” 23์ผ

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

๋ชฉ๋ก ๋ณด๊ธฐ
3/28
post-thumbnail

ํŠธ๋ฆฌ(Tree)


ํŠธ๋ฆฌ(tree)๋Š” ์ด์ฐจ์›์˜ ์ž๋ฃŒ๊ตฌ์กฐ๋กœ ๋…ธ๋“œ์™€ ์—ฃ์ง€๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ์˜ ๋ฐฐ์น˜ํ˜•ํƒœ๋ฅผ ์ถ”์ƒํ™”ํ•œ ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค.

์ด์ง„ํŠธ๋ฆฌ(binary Tree)


๋ชจ๋“  ๋…ธ๋“œ์˜ ์ฐจ์ˆ˜๊ฐ€ 2 ์ดํ•˜์ธ ํŠธ๋ฆฌ์ž…๋‹ˆ๋‹ค.
*์žฌ๊ท€์ ์œผ๋กœ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Œ

์ด์ง„ํŠธ๋ฆฌ์˜ ์—ฐ์‚ฐ

  • size: ๋…ธ๋“œ์˜ ์ˆ˜
  • depth ํŠธ๋ฆฌ์˜ ๊นŠ์ด
  • ์ˆœํšŒ(traversal)
    -๊นŠ์ด ์šฐ์„  ์ˆœํšŒ
    1)์ค‘์œ„์ˆœํšŒ
    2)์ „์œ„์ˆœํšŒ
    3)ํ›„์œ„์ˆœํšŒ
    //์ˆœํšŒ์˜ ์ˆœ์„œ
	1. left subtree, 2. ์ž๊ธฐ ์ž์‹  3.right subtree
#์ „์œ„์ˆœํšŒ(Pre-order Traversal)
	1. ์ž๊ธฐ์ž์‹ , 2. left subtree 3.right subtree
#ํ›„์œ„์ˆœํšŒ(post-order Traversal)
	1. left subtree, 2. right subtree 3.์ž๊ธฐ ์ž์‹ 

-๋„“์ด ์šฐ์„  ์ˆœํšŒ

  • ์ˆ˜์ค€(level)์ด ๋‚ฎ์€ ๋…ธ๋“œ๋ฅผ ์šฐ์„ ์œผ๋กœ ๋ฐฉ๋ฌธ
  • ๊ฐ™์€ ์ˆ˜์ค€์˜ ๋…ธ๋“œ๋“ค ์‚ฌ์ด์—๋Š” ๋ถ€๋ชจ๋…ธ๋“œ์˜ ๋ฐฉ๋ฌธ ์ˆœ์„œ์—๋”ฐ๋ผ, ์™ผ์ชฝ์ž์‹๋…ธ๋“œ๋ฅผ ์˜ค๋ฅธ์ชฝ ์ž์‹๋…ธ๋“œ๋ณด๋‹ค ๋จผ์ €
  • ํ•œ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ–ˆ์„ ๋•Œ ๋‚˜์ค‘์— ๋ฐฉ๋ฌธํ•  ๋…ธ๋“œ๋“ค์„ ์ˆœ์„œ๋Œ€๋กœ ๊ธฐ๋กํ•ด ๋‘์–ด์•ผ ํ•œ๋‹ค.

์ด์ง„ํŠธ๋ฆฌ์˜ ๊ตฌํ˜„

Node - ๋ฐ์ดํ„ฐ, LeftChild, RightChild
Tree - root,leaf
size() - ์žฌ๊ท€์ ์œผ๋กœ ๊ฐ๊ฐ์˜ ์„œ๋ธŒํŠธ๋ฆฌ์‚ฌ์ด์ฆˆ +1(์ž๊ธฐ์ž์‹ )
depth() - ๊ฐ€์žฅ ํฐ depth๋ฅผ ๊ฐ€์ง„ ์„œ๋ธŒํŠธ๋ฆฌ +1
inorder() - ์ค‘์œ„์ˆœํšŒ
preorder() - ์ „์œ„์ˆœํšŒ
postorder() - ํ›„์œ„์ˆœํšŒ
bft() - ๋„“์ด ์šฐ์„  ์ˆœํšŒ

๋‹ค์Œ์€ ํŒŒ์ด์ฌ์œผ๋กœ ๊ตฌํ˜„ํ•œ ์ฝ”๋“œ์ด๋‹ค.

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

    def size(self):
        l = self.left.size() if self.left else 0
        r = self.right.size() if self.right else 0
        return l+r+1

    def depth(self):
        l = self.left.depth() if self.left else 0
        r = self.right.depth() if self.right else 0
        return max(l,r) + 1

    def inorder(self):
        traversal = []
        if self.left:
            traversal += self.left.inorder()
        traversal.append(self.data)
        if self.right:
            traversal += self.right.inorder()
        return traversal

    def preorder(self):
        traversal = []
        traversal.append(self.data)
        if self.left:
            traversal += self.left.preorder()
        if self.right:
            traversal += self.right.preorder()
        return traversal

    def postorder(self):
        traversal = []
        if self.left:
            traversal += self.left.postorder()
        if self.right:
            traversal += self.right.postorder()
        traversal.append(self.data)
        return traversal

class BinaryTree:
    def __init__(self,r):
        self.root = r

    def size(self):
        if self.root:
            return self.root.size()
        else:
            return 0

    def depth(self):
        if self.root:
            return self.root.depth()
        else:
            return 0

    def inorder(self):
        if self.root:
            return self.root.inorder()
        else:
            return []
ใ…‘
    def preorder(self):
        if self.root:
            return self.root.preorder()
        else:
            return []

    def postorder(self):
        if self.root:
            return self.root.postorder()
        else:
            return []

    def bft(self):
        #๋ฆฌํ„ดํ•  ๋ณ€์ˆ˜์— ๋นˆ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋„ฃ๊ณ , ๋นˆํ ์ƒ์„ฑ
        traversal = []
        q = ArrayQueue()
        #๋นˆ ํŠธ๋ฆฌ๊ฐ€ ์•„๋‹ˆ๋ฉด rootnode๋ฅผ ํ์— ์ถ”๊ฐ€
        if self.root:
            q.enqueue(self.root.data)
        while q:# ํ๊ฐ€ ๋น„์–ด์žˆ์ง€ ์•Š๋Š”๋™์•ˆ
            element = q.dequeue() #node<-ํ ์—์„œ ์›์†Œ๋ฅผ ์ถ”์ถœ
            traversal.append(element.data) #node๋ฅผ ๋ฐฉ๋ฌธํ–ˆ๋‹ค๋Š” ํ‘œ์‹œ
             #์ž์‹ ๋…ธ๋“œ๊ฐ€ ์žˆ์œผ๋ฉด ์™ผ์ชฝ ์˜ค๋ฅธ์ชฝ์ž์‹๋“ค ํ์— ์ถ”๊ฐ€
            if element.left:
                q.enqueue(element.left)
            if element.right:
                q.enqueue(element.right)

        return traversal

๐Ÿ’ก๋Œ€๋ถ€๋ถ„์˜ ์ˆœํšŒ๋Š” ์žฌ๊ท€์ ์œผ๋กœ ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ–ˆ์ง€๋งŒ, ๋„“์ด ์šฐ์„  ์ˆœํšŒ๋Š” ํ•œ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ–ˆ์„ ๋•Œ ์ž์‹๋…ธ๋“œ๋„ ๋ฐฉ๋ฌธํ•ด์•ผ ํ•˜์ง€๋งŒ ๊ฐ™์€ ์ˆ˜์ค€์˜ ๋…ธ๋“œ๋“ค์„ ๋จผ์ € ๋ฐฉ๋ฌธํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์žฌ๊ท€์ ์ธ ์„ฑ์งˆ์„ ๊ฐ€์ง€์ง€ ์•Š์•„ ์žฌ๊ท€์ ์œผ๋กœ ๊ตฌํ˜„์ด ๋ถˆ๊ฐ€๋Šฅํ–ˆ๋‹ค.

profile
๊ฒŒ์„๋ €๋˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ณต๋ถ€

0๊ฐœ์˜ ๋Œ“๊ธ€