ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

๋ฐ˜์‘ํ˜•

๋„“์ด ์šฐ์„  ์ˆœํšŒ (Breadth First Traversal)

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

๋…ธ๋“œ์˜ ์ˆ˜์ค€์— ๋”ฐ๋ผ ์ˆœ์„œ๋ฅผ ์ •ํ•˜์—ฌ ๋…ธ๋“œ๋“ค์„ ๋ฐฉ๋ฌธํ•˜๋Š” ์ˆœํšŒ ๋ฐฉ์‹์ด๋‹ค. ์ด ๋ฐฉ์‹์€ ํ•˜๋‚˜์˜ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ–ˆ์„ ๋•Œ ๋‚˜์ค‘์— ๊ทธ ๋…ธ๋“œ์˜ ์ž์‹ ๋…ธ๋“œ๋“ค์„ ๋ฐฉ๋ฌธํ•˜๊ธฐ๋กœ ํ•ด ๋‘๊ณ  ๊ฐ™์€ ์ˆ˜์ค€์— ์žˆ๋Š” ๋‹ค๋ฅธ ๋…ธ๋“œ๋“ค(์ง์ ‘ ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ๋ง๊ณ ) ์„ ์šฐ์„  ๋ฐฉ๋ฌธํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์žฌ๊ท€์ ์ธ ์„ฑ์งˆ์„ ๊ฐ–์ง€ ์•Š๋Š”๋‹ค.

๋‚˜์ค‘์— ๋‹ค์‹œ ๋ฐฉ๋ฌธํ•˜๊ธฐ๋กœ ํ•˜๊ณ  ๊ทธ ์ˆœ์„œ๋ฅผ ๊ธฐ์–ตํ•ด๋‘์ž! ์— ์ ํ•ฉํ•œ ์ž๋ฃŒ๊ตฌ์กฐ๋Š” ํ๊ฐ€ ์žˆ๋‹ค. ๋จผ์ € ๋„ฃ์€ ์›์†Œ๊ฐ€ ๋จผ์ € ๋‚˜์˜ค๋Š” ์„ ์ž…์„ ์ถœ ์„ฑ์งˆ์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ๋Š” ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ์‘์šฉ์— ์ ํ•ฉํ•˜๋‹ค.

 

 

 

๋„“์ด ์šฐ์„  ์ˆœํšŒ ํ๋ฆ„ ์„ค๊ณ„

์ˆ˜์ค€์ด ๋‚ฎ์€ ๋…ธ๋“œ๋ถ€ํ„ฐ ๋ฐฉ๋ฌธํ•ด์„œ ํ์— enqueue
A๋ฅผ dequeue(A๋ฅผ ๋ฐฉ๋ฌธํ•จ)
A์˜ ์ž์‹๋…ธ๋“œ ์™ผ์ชฝ->์˜ค๋ฅธ์ชฝ์œผ๋กœ 
B๋ฅผ dequeue (B๋ฐฉ๋ฌธ)
B์˜ ์ž์‹๋…ธ๋“œ enqueue
C ๋ฅผ dequeue (C ๋ฐฉ๋ฌธ)
C์˜ ์ž์‹๋…ธ๋“œ enqueue
D๋ฅผ ๋ฐฉ๋ฌธ (D enqueue)
D์˜ ์ž์‹๋…ธ๋“œ enqueue
E๋ฅผ ๋ฐฉ๋ฌธ (dequeue) E์˜ ์ž์‹๋…ธ๋“œ ์—†์Œ
F๋ฅผ ๋ฐฉ๋ฌธ (dequeue)
F์˜ ์ž์‹๋…ธ๋“œ enqueue
G๋ฅผ ๋ฐฉ๋ฌธ (enequeue) G์˜ ์ž์‹๋…ธ๋“œ ์—†์Œ
๋…ธ๋“œ H ๋ฐฉ๋ฌธ (enequeue) H์˜ ์ž์‹๋…ธ๋“œ ์—†์Œ
๋…ธ๋“œ I๋ฐฉ๋ฌธ (dequeue) I์˜ ์ž์‹๋…ธ๋“œ ์—†์Œ ํ๊ฐ€ ๋น„๋ฉด ์ˆœํšŒ ๋ 

 

 

 

๋„“์ด ์šฐ์„  ์ˆœํšŒ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ตฌํ˜„

  1. traversal์—๋Š” ๋นˆ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ดˆ๊ธฐํ™”, q์—๋Š” ๋นˆ ํ๋ฅผ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.
  2. ๋นˆ ํŠธ๋ฆฌ๊ฐ€ ์•„๋‹ˆ๋ฉด, root node๋ฅผ ํ์— ์ถ”๊ฐ€(enqueue)ํ•œ๋‹ค.
  3. q๊ฐ€ ๋น„์–ด์žˆ์ง€ ์•Š๋Š” ๋™์•ˆ q์˜ ์›์†Œ๋ฅผ ์ถ”์ถœํ•˜์—ฌ(dequeue) node์— ์ €์žฅํ•œ๋‹ค
  4. node๋ฅผ ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ (traversal์— append)ํ•œ๋‹ค.
  5. node์˜ ์™ผ์ชฝ, ์˜ค๋ฅธ์ชฝ ์ž์‹ ๋…ธ๋“œ๊ฐ€ ์žˆ์œผ๋ฉด q์— ์ถ”๊ฐ€ํ•œ๋‹ค.
  6. q๊ฐ€ ๋นˆํ๊ฐ€ ๋˜๋ฉด ๋ชจ๋“  ๋…ธ๋“œ ๋ฐฉ๋ฌธ ์™„๋ฃŒ๋˜์—ˆ์œผ๋ฏ€๋กœ traversal์„ ๋ฆฌํ„ดํ•œ๋‹ค.

 

class ArrayQueue:

    def __init__(self):
        self.data = []

    def size(self):
        return len(self.data)

    def isEmpty(self):
        return self.size() == 0

    def enqueue(self, item):
        self.data.append(item)

    def dequeue(self):
        return self.data.pop(0)

    def peek(self):
        return self.data[0]


class Node:

    def __init__(self, item):
        self.data = item
        self.left = None
        self.right = None


class BinaryTree:

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

    def bft(self):
        # ๋นˆ ๋ฆฌ์ŠคํŠธ ์ดˆ๊ธฐํ™”
        traversal = []
        # ๋นˆ ํ ์ดˆ๊ธฐํ™”
        visitQueue = ArrayQueue()

        # ๋นˆ ํŠธ๋ฆฌ๊ฐ€ ์•„๋‹ˆ๋ฉด ๋ฃจํŠธ ๋…ธ๋“œ๊ฐ€ ์žˆ๋Š” ๊ฒƒ -> ํ์— ๋ฃจํŠธ ๋…ธ๋“œ๋ฅผ ์ธํ
        if self.root:
            visitQueue.enqueue(self.root)

        # ํ๊ฐ€ ๋น„์–ด์žˆ์ง€ ์•Š๋Š” ๋™์•ˆ ๋ฐ˜๋ณต
        while visitQueue.isEmpty()==False:
            # ํ์—์„œ ๊บผ๋‚ด์„œ node์— ์ €์žฅ
            node = visitQueue.dequeue()
            # ๊บผ๋‚ธ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธ ๋ฆฌ์ŠคํŠธ์— ์ €์žฅ
            traversal.append(node.data)

            # ๋…ธ๋“œ์— ์™ผ์ชฝ ์ž์‹ ๋…ธ๋“œ๊ฐ€ ์กด์žฌํ•˜๋Š”๊ฒฝ์šฐ ํ์— ์ €์žฅ
            if node.left:
                visitQueue.enqueue(node.left)
            # ๋…ธ๋“œ์— ์˜ค๋ฅธ์ชฝ ์ž์‹ ๋…ธ๋“œ๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ ํ์— ์ €์žฅ
            if node.right:
                visitQueue.enqueue(node.right)
            
        return traversal


def solution(x):
    return 0
๋ฐ˜์‘ํ˜•
๋Œ“๊ธ€