๐Ÿ“’ ํŠธ๋ฆฌ - ์ˆœํšŒ

Kimdongkiยท2024๋…„ 3์›” 27์ผ

์•Œ๊ณ ๋ฆฌ์ฆ˜

๋ชฉ๋ก ๋ณด๊ธฐ
4/8

๐Ÿ“Œ ๊นŠ์ด ์šฐ์„  ์ˆœํšŒ

๐Ÿ“™ ๊ตฌํ˜„

  • ์ค‘์œ„ ์ˆœํšŒ(in-order traversal) : ์™ผ์ชฝ ์˜ค๋ฅธ์ชฝ ์‚ฌ์ด์˜ ์ž๊ธฐ์ž์‹ ์„ ์ˆœํšŒํ•˜๋Š” ๊ฒƒ

    1. Left subtree
    2. ์ž๊ธฐ ์ž์‹ 
    3. Right subtree
    class Node:
        def inorder(self):
            traversal = []
            if self.left:
                traversal += self.left.inorder()
            traversal.append(self.data)
            if self.right:
                traversal += self.right.inorder()
            return traversal
    class BinaryTree:
        def inorder(self):
            if self.root:
                return self.root.inorder()
            else: # ๋นˆ ํŠธ๋ฆฌ์ธ ๊ฒฝ์šฐ
                return []
  • ์ „์œ„ ์ˆœํšŒ(pre-order traversal) : ์ž๊ธฐ์ž์‹ ์„ ๋จผ์ € ์ˆœํšŒํ•˜๋Š” ๊ฒƒ

    1. ์ž๊ธฐ ์ž์‹ 
    2. Left subtree
    3. Right subtree
    class Node:
    	def preorder(self):
        	traversal = []
            traversal.append(self.data)
            if self.left:
            	traversal += self.left.preorder()
            if self.right:
            	traversal += self.right.preorder()
            return traversal
    class BinaryTree:
    	def preorder(self):
        	if self.root:
            	return self.root.preorder()
            else:
            	return []
  • ํ›„์œ„ ์ˆœํšŒ(post-order traversal) : ์ž๊ธฐ์ž์‹ ์„ ๋งˆ์ง€๋ง‰์— ์ˆœํšŒํ•˜๋Š” ๊ฒƒ

    1. Left subtree
    2. Right subtree
    3. ์ž๊ธฐ ์ž์‹ 
    class Node:
    	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 Postorder(self):
        	if self.root:
            	return self.root.Postorder()
            else:
            	return []

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

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

๐Ÿ“™ ๊ตฌํ˜„

  1. ๋นˆ ๋ฆฌ์ŠคํŠธ -> (์ดˆ๊ธฐํ™”) traversal, ๋นˆ ํ -> q
  2. ๋นˆ ํŠธ๋ฆฌ๊ฐ€ ์•„๋‹ˆ๋ฉด, root node๋ฅผ q์— ์ถ”๊ฐ€(enqueue)
  3. q๊ฐ€ ๋น„์–ด ์žˆ์ง€ ์•Š์€ ๋™์•ˆ
    3-1. q์—์„œ node์›์†Œ๋ฅผ ์ถ”์ถœ(dequeue)
    3-2. node๋ฅผ ๋ฐฉ๋ฌธ
    3-3. node์˜ ์™ผ์ชฝ, ์˜ค๋ฅธ์ชฝ ์ž์‹(์žˆ์œผ๋ฉด)๋“ค์„ q์— ์ถ”๊ฐ€
  4. q๊ฐ€ ๋นˆ ํ๊ฐ€ ๋˜๋ฉด ๋ชจ๋“  ๋…ธ๋“œ ๋ฐฉ๋ฌธ ์™„๋ฃŒ
class BinaryTree:
	def bft(self):
    	q = ArrayQueue()
        traversal = []
        if self.root:
        	q.append(self.root)
        while q.Empty()==0:
        	node = q.dequeue
            traversal.append(node.data)
            if node.left:
            	q.enqueue(node.left)
            if node.right:
            	q.enqueue(node.right)
        return traversal

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