ํŠธ๋ฆฌ๐ŸŽ„(Tree)

soo-hyeonยท2021๋…„ 1์›” 31์ผ
0

์•Œ๊ณ ๋ฆฌ์ฆ˜

๋ชฉ๋ก ๋ณด๊ธฐ
6/7

ํŠธ๋ฆฌ๋ž€?

โ–ท ํŠธ๋ฆฌ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋Œ€์ƒ ์ •๋ณด์˜ ๊ฐ ํ•ญ๋ชฉ๋“ค์„ ๊ณ„์ธต์ ์œผ๋กœ ์—ฐ๊ด€๋˜๋„๋ก ๊ตฌ์กฐํ™”์‹œํ‚ค๊ณ ์ž ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋น„์„ ํ˜• ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค.

โ–ถ ๋ฐ์ดํ„ฐ ์š”์†Œ๋“ค์˜ ๋‹จ์ˆœํ•œ ๋‚˜์—ด์ด ์•„๋‹Œ ๋ถ€๋ชจ-์ž์‹ ๊ด€๊ณ„์˜ ๊ณ„์ธต์  ๊ตฌ์กฐ๋กœ ํ‘œํ˜„์ด ๋œ๋‹ค. ํŠธ๋ฆฌ๋Š” ๊ทธ๋ž˜ํ”„์˜ ํ•œ ์ข…๋ฅ˜์ด๋ฉฐ ์‚ฌ์ดํด์ด ์—†๋‹ค.

ํŠธ๋ฆฌ์™€ ๊ด€๋ จ๋œ ์šฉ์–ด

โ–ท ๋ฃจํŠธ ๋…ธ๋“œ(root node) : ๋ถ€๋ชจ๊ฐ€ ์—†๋Š” ๋…ธ๋“œ, ํŠธ๋ฆฌ๋Š” ํ•˜๋‚˜์˜ ๋ฃจํŠธ ๋…ธ๋“œ๋งŒ์„ ๊ฐ€์ง„๋‹ค.

โ–ถ ๋…ธ๋“œ(node) : ํŠธ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•˜๊ณ  ์žˆ๋Š” ๊ฐ ์š”์†Œ

โ–ท ๊ฐ„์„ (edge) : ๋…ธ๋“œ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ์„ (link, branch ๋ผ๊ณ ๋„ ๋ถ€๋ฆ„)

โ–ถ ํ˜•์ œ(sibling) : ๊ฐ™์€ ๋ถ€๋ชจ๋ฅผ ๊ฐ€์ง€๋Š” ๋…ธ๋“œ

โ–ท ๋…ธ๋“œ์˜ ๋ ˆ๋ฒจ(level) : ํŠธ๋ฆฌ์˜ ํŠน์ • ๊นŠ์ด๋ฅผ ๊ฐ€์ง€๋Š” ๋…ธ๋“œ์˜ ์ง‘ํ•ฉ

โ–ถ ๋…ธ๋“œ์˜ ์ฐจ์ˆ˜(degree) : ํ•˜์œ„ ํŠธ๋ฆฌ ๊ฐœ์ˆ˜ / ๊ฐ„์„  ์ˆ˜(degree) = ๊ฐ ๋…ธ๋“œ๊ฐ€ ์ง€๋‹Œ ๊ฐ€์ง€์˜ ์ˆ˜

ํŠธ๋ฆฌ์˜ ์ข…๋ฅ˜

์ด์ง„ ํŠธ๋ฆฌ๐ŸŽ„๐ŸŒฒ(Binary Tree)

โŠ™ ๊ฐ ๋…ธ๋“œ๊ฐ€ ์ตœ๋Œ€ ๋‘ ๊ฐœ์˜ ์ž์‹์„ ๊ฐ–๋Š” ํŠธ๋ฆฌ
โŠ™ ๋ชจ๋“  ํŠธ๋ฆฌ๊ฐ€ ์ด์ง„ ํŠธ๋ฆฌ๋Š” ์•„๋‹ˆ๋‹ค.
โŠ™ ์ด์ง„ํŠธ๋ฆฌ๋Š” ์™„์ „ ์ด์ง„ ํŠธ๋ฆฌ(Complete Binary Tree)์™€ ํฌํ™” ์ด์ง„ ํŠธ๋ฆฌ(Perfect Binary Tree), ์ „ ์ด์ง„ ํŠธ๋ฆฌ(Full Binary Tree)๋ผ๊ณ  ํ•˜๋Š” ํŠน๋ณ„ํ•œ ํŠธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

๐ŸŽ„ ์™„์ „ ์ด์ง„ ํŠธ๋ฆฌ(Complete Binary Tree)


โŠ™ ํŠธ๋ฆฌ์˜ ๋ชจ๋“  ๋†’์ด์—์„œ ๋…ธ๋“œ๊ฐ€ ๊ฝ‰ ์ฐจ ์žˆ๋Š” ์ด์ง„ ํŠธ๋ฆฌ. ์ฆ‰, ๋งˆ์ง€๋ง‰ ๋ ˆ๋ฒจ์„ ์ œ์™ธํ•˜๊ณ  ๋ชจ๋“  ๋ ˆ๋ฒจ์ด ์™„์ „ํžˆ ์ฑ„์›Œ์ ธ ์žˆ๋‹ค.
โŠ™ ๋งˆ์ง€๋ง‰ ๋ ˆ๋ฒจ์€ ๊ฝ‰ ์ฐจ ์žˆ์ง€ ์•Š์•„๋„ ๋˜์ง€๋งŒ ๋…ธ๋“œ๊ฐ€ ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ฑ„์›Œ์ ธ์•ผ ํ•œ๋‹ค.

๐ŸŒฒ ์ „ ์ด์ง„ ํŠธ๋ฆฌ(Full Binary Tree or Strictly Binary Tree)


โŠ™ ๋ชจ๋“  ๋…ธ๋“œ๊ฐ€ 0๊ฐœ ๋˜๋Š” 2๊ฐœ์˜ ์ž์‹ ๋…ธ๋“œ๋ฅผ ๊ฐ–๋Š” ํŠธ๋ฆฌ

๐ŸŒณ ํฌํ™” ์ด์ง„ ํŠธ๋ฆฌ(Perfect Binary Tree)


โŠ™ ๋ชจ๋“  ๋ ˆ๋ฒจ์— ๋…ธ๋“œ๊ฐ€ ์ฐจ์žˆ๋Š” ์ƒํƒœ๋กœ ์ตœ๋Œ€ ๋…ธ๋“œ ์ˆ˜์ธ 2^k-1๊ฐœ๋กœ ์ฑ„์›Œ์ ธ ์žˆ๋Š” ํŠธ๋ฆฌ
โŠ™ ์ „ ์ด์ง„ ํŠธ๋ฆฌ์ด๋ฉด์„œ ์™„์ „ ์ด์ง„ ํŠธ๋ฆฌ์ธ ๊ฒฝ์šฐ

๐Ÿ”Ž ์ด์ง„ ํŠธ๋ฆฌ ์ˆœํšŒ

a. ์ค‘์œ„ ์ˆœํšŒ(in-order traversal) : ์™ผ์ชฝ ๊ฐ€์ง€ -> ํ˜„์žฌ ๋…ธ๋“œ(๋ฃจํŠธ) -> ์˜ค๋ฅธ์ชฝ ๊ฐ€์ง€

def inorder(node) :
    if node.left != None :
        inorder(tree[node.left])
    print(node.item, end = ' ')
    if node.right != None :
        inorder(tree[node.right])

b. ์ „์œ„ ์ˆœํšŒ(pre-order traversal) : ํ˜„์žฌ ๋…ธ๋“œ(๋ฃจํŠธ) -> ์™ผ์ชฝ ๊ฐ€์ง€ -> ์˜ค๋ฅธ์ชฝ ๊ฐ€์ง€

def preorder(node) :
    print(node.item, end = ' ')
    if node.left != None :
        inorder(tree[node.left])
    if node.right != None :
        inorder(tree[node.right])

c. ํ›„์œ„ ์ˆœํšŒ(post-order traversal) : ์™ผ์ชฝ ๊ฐ€์ง€ -> ์˜ค๋ฅธ์ชฝ ๊ฐ€์ง€ -> ํ˜„์žฌ ๋…ธ๋“œ(๋ฃจํŠธ)

def postorder(node) :
    if node.left != None :
        inorder(tree[node.left])
    if node.right != None :
        inorder(tree[node.right])
    print(node.item, end = ' ')

๐Ÿ” ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ(Binary Search Tree)

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

๐Ÿ“Œ ๋ชจ๋“  ์™ผ์ชฝ ์ž์‹๋“ค <= n < ๋ชจ๋“  ์˜ค๋ฅธ์ชฝ ์ž์‹๋“ค (๋ชจ๋“  ๋…ธ๋“œ n์— ๋Œ€ํ•ด์„œ ๋ฐ˜๋“œ์‹œ ์ฐธ)

ํž™(heap)

๐Ÿ”‘ ์™„์ „ ์ด์ง„ ํŠธ๋ฆฌ์˜ ์ผ์ข…์œผ๋กœ ์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ์œ„ํ•˜์—ฌ ๋งŒ๋“ค์–ด์ง„ ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค.
์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ฐ’๋“ค ์ค‘์—์„œ ์ตœ๋Œ“๊ฐ’์ด๋‚˜ ์ตœ์†Ÿ๊ฐ’์„ ๋น ๋ฅด๊ฒŒ ์ฐพ์•„๋‚ด๋„๋ก ๋งŒ๋“ค์–ด์ง„ ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค.

๐Ÿ“ ํŠธ๋ฆฌ์˜ ๋งˆ์ง€๋ง‰ ๋‹จ๊ณ„์—์„œ ์˜ค๋ฅธ์ชฝ ๋ถ€๋ถ„์„ ๋บ€ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์ด ๊ฐ€๋“ ์ฑ„์›Œ์ ธ ์žˆ๋Š” ์™„์ „ ์ด์ง„ ํŠธ๋ฆฌ์ด๋‹ค.

์ตœ์†Œ ํž™(min heap)
๋ถ€๋ชจ ๋…ธ๋“œ์˜ ํ‚ค ๊ฐ’์ด ์ž์‹ ๋…ธ๋“œ์˜ ํ‚ค ๊ฐ’๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์™„์ „ ์ด์ง„ ํŠธ๋ฆฌ
key(๋ถ€๋ชจ ๋…ธ๋“œ) <= key(์ž์‹ ๋…ธ๋“œ)

์ตœ๋Œ€ ํž™(max heap)
๋ถ€๋ชจ ๋…ธ๋“œ์˜ ํ‚ค ๊ฐ’์ด ์ž์‹ ๋…ธ๋“œ์˜ ํ‚ค ๊ฐ’๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™์€ ์™„์ „ ์ด์ง„ ํŠธ๋ฆฌ
key(๋ถ€๋ชจ ๋…ธ๋“œ) >= key(์ž์‹ ๋…ธ๋“œ)

MAX - Heapify
ํŠธ๋ฆฌ์˜ ์ „์ฒด ๋ชจ์–‘์€ complete binary tree์ด๋‹ค. ์™ผ์ชฝ ๋ถ€ํŠธ๋ฆฌ(subtree)๋Š” ๊ทธ ์ž์ฒด๋กœ heap์ด๊ณ , ์˜ค๋ฅธ์ชฝ ๋ถ€ํŠธ๋ฆฌ(subtree)๋„ ๊ทธ ์ž์ฒด๋กœ heap์ผ ๋•Œ ์œ ์ผํ•˜๊ฒŒ ๋ฃจํŠธ๋งŒ์ด heap property๋ฅผ ๋งŒ์กฑํ•˜์ง€ ์•Š์„ ๋•Œ heap property๋ฅผ ๋งŒ์กฑํ•˜๋„๋ก ๋งŒ๋“ค์–ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.
โญ ๋ฐฉ๋ฒ• : ๋‘ ์ž์‹๋“ค ์ค‘ ๋” ํฐ ์ชฝ๊ณผ exchange ํ•œ๋‹ค. ์ด๊ฑธ ๋ฐ˜๋ณตํ•˜๋ฉด ๋œ๋‹ค.

๐Ÿ’ฅ heap sort

  1. ์ฃผ์–ด์ง„ ๋ฐ์ดํ„ฐ๋กœ ํž™์„ ๋งŒ๋“ ๋‹ค

  2. ํž™์—์„œ ์ตœ๋Œ€๊ฐ’(๋ฃจํŠธ)์„ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰ ๊ฐ’๊ณผ ๋ฐ”๊พผ๋‹ค

  3. ํž™์˜ ํฌ๊ธฐ๊ฐ€ 1 ์ค„์–ด๋“  ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•œ๋‹ค. ์ฆ‰, ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰ ๊ฐ’์€ ํž™์˜ ์ผ๋ถ€๊ฐ€ ์•„๋‹Œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•œ๋‹ค

  4. ๋ฃจํŠธ ๋…ธ๋“œ์— ๋Œ€ํ•ด์„œ Heapify(1)ํ•œ๋‹ค

  5. 2~4๋ฒˆ์„ ๋ฐ˜๋ณตํ•œ๋‹ค

๐Ÿ”ฅ ์™„์ „ ์ด์ง„ ํŠธ๋ฆฌ, ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ, heap์˜ ์ •์˜๋ฅผ ์ •ํ™•ํžˆ ์•Œ์•„๋‘๊ณ  ํ—ท๊ฐˆ๋ฆฌ์ง€ ์•Š๋„๋ก ํ•˜์ž! ๐Ÿ”ฅ

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