๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์•Œ๊ณ ๋ฆฌ์ฆ˜

์ œ 10๊ฐ• ํŠธ๋ฆฌ์™€ ์ด์ง„ํŠธ๋ฆฌ

by devshin.kr 2020. 11. 8.
728x90

 

  • ํŠธ๋ฆฌ (Tree)

๊ณ„์ธต์ ์ธ ๊ตฌ์กฐ๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค๋ฉด ์กฐ์ง๋„๋‚˜ ๋””๋ ‰ํ† ๋ฆฌ์™€ ์„œ๋ธŒ๋””๋ ‰ํ† ๋ฆฌ์˜ ๊ตฌ์กฐ๋ฅผ ํ‘œํ˜„ํ•  ๋•Œ, ๊ฐ€๊ณ„๋„๋ฅผ ํ‘œํ˜„ํ•  ๋•Œ ์“ด๋‹ค.

 

  • ํŠธ๋ฆฌ๋Š” ๋…ธ๋“œ(node) ๋“ค๊ณผ ๋…ธ๋“œ๋“ค์„ ์—ฐ๊ฒฐํ•˜๋Š” ๋งํฌ(link)๋“ค๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.

 

  • ๋ฃจํŠธ(root) : ๋งจ ์œ„์˜ ๋…ธ๋“œ
  • ๋งํฌ(link) : ๋…ธ๋“œ๋“ค์„ ์—ฐ๊ฒฐํ•˜๋Š” ์„  (=edge, branch)

 

 

  • ํŠธ๋ฆฌ์˜ ๋ถ€๋ชจ-์ž์‹ ๊ด€๊ณ„

ํŠธ๋ฆฌ ๊ตฌ์กฐ ์ƒ์—์„œ ์ƒ๋Œ€์ ์œผ๋กœ ์œ„์— ์žˆ๋Š” ๋…ธ๋“œ๋ฅผ ๋ถ€๋ชจ ๋…ธ๋“œ๋ผ ํ•˜๊ณ , ์•„๋ž˜์— ์žˆ๋Š” ๋…ธ๋“œ๋ฅผ ์ž์‹ ๋…ธ๋“œ๋ผ ํ•œ๋‹ค.

 

 

  • ํŠธ๋ฆฌ์˜ ํ˜•์ œ ๊ด€๊ณ„

๋ถ€๋ชจ๊ฐ€ ๋™์ผํ•œ ๋…ธ๋“œ๋“ค์„ ํ˜•์ œ(sibling) ๊ด€๊ณ„๋ผ๊ณ  ํ•œ๋‹ค.

๋ฃจํŠธ ๋…ธ๋“œ๋ฅผ ์ œ์™ธํ•œ ํŠธ๋ฆฌ์˜ ๋ชจ๋“  ๋…ธ๋“œ๋“ค์€ ์œ ์ผํ•œ ๋ถ€๋ชจ ๋…ธ๋“œ๋ฅผ ๊ฐ€์ง„๋‹ค.

 

 

  • ๋ฆฌํ”„๋…ธ๋“œ

์ž์‹์ด ์—†๋Š” ๋…ธ๋“œ๋“ค์„ ๋ฆฌํ”„(leaf) ๋…ธ๋“œ๋ผ ํ•œ๋‹ค.

๋ฆฌํ”„๋…ธ๋“œ๊ฐ€ ์•„๋‹Œ ๋…ธ๋“œ๋“ค์„ ๋‚ด๋ถ€(internal)๋…ธ๋“œ๋ผ ํ•œ๋‹ค.

 

 

  • ํŠธ๋ฆฌ์˜ ์กฐ์ƒ-์ž์† ๊ด€๊ณ„

๋ถ€๋ชจ-์ž์‹ ๊ด€๊ณ„๋ฅผ ํ™•์žฅํ•œ ๊ฒƒ์ด ์กฐ์ƒ-์ž์† ๊ด€๊ณ„์ด๋‹ค.

 

 

  • ๋ถ€ํŠธ๋ฆฌ(subtree)

ํŠธ๋ฆฌ์—์„œ ์–ด๋–ค ํ•œ ๋…ธ๋“œ์™€ ๊ทธ ๋…ธ๋“œ์˜ ์ž์†๋“ค๋กœ ์ด๋ฃจ์–ด์ง„ ํŠธ๋ฆฌ๋ฅผ ๋ถ€ํŠธ๋ฆฌ(subtree)๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

ํŠธ๋ฆฌ์—์„œ ์–ด๋–ค ์ผ๋ถ€๋ถ„์„ ์ž˜๋ผ๋‚ด์–ด ๋ดค์„ ๋•Œ ํŠธ๋ฆฌ๊ฐ€ ๋œ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.

 

 

  • ํŠธ๋ฆฌ์˜ ๋ ˆ๋ฒจ

ํŠธ๋ฆฌ์˜ ๋…ธ๋“œ๋“ค์€ ๋ ˆ๋ฒจ๋กœ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฃจํŠธ๋…ธ๋“œ๋Š” level 1 ๋˜๋Š” level 0์ด ๋œ๋‹ค. (๋ถ™์ด๋Š” ์‚ฌ๋žŒ ๋‚˜๋ฆ„)

๊ทธ๋ฆฌ๊ณ  ๋ฃจํŠธ๋…ธ๋“œ์˜ ์ž์‹๋…ธ๋“œ๋“ค์€ ๋ฃจํŠธ๋…ธ๋“œ๊ฐ€ level1์ธ ๊ฒฝ์šฐ์—๋Š” ๋ชจ๋‘ level2๊ฐ€ ๋˜๊ณ , ๋ฃจํŠธ๋…ธ๋“œ๊ฐ€ level0์ธ ๊ฒฝ์šฐ์—๋Š” ๋ชจ๋‘ level1์ด ๋œ๋‹ค.

 

 

  • ํŠธ๋ฆฌ์˜ ๋†’์ด

์„œ๋กœ ๋‹ค๋ฅธ ๋ ˆ๋ฒจ์˜ ๊ฐฏ์ˆ˜๋ฅผ ๋งํ•œ๋‹ค.

 

 

  • ํŠธ๋ฆฌ์˜ ๊ธฐ๋ณธ์ ์ธ ์„ฑ์งˆ

- ๋…ธ๋“œ๊ฐ€ N๊ฐœ์ธ ํŠธ๋ฆฌ๋Š” ํ•ญ์ƒ N-1๊ฐœ์˜ ๋งํฌ(link)๋ฅผ ๊ฐ€์ง„๋‹ค.

- ํŠธ๋ฆฌ์—์„œ ๋ฃจํŠธ์—์„œ ์–ด๋–ค ๋…ธ๋“œ๋กœ ๊ฐ€๋Š” ๊ฒฝ๋กœ๋Š” ์œ ์ผํ•˜๋‹ค. ๋˜ํ•œ ์ž„์˜์˜ ๋‘ ๋…ธ๋“œ๊ฐ„์˜ ๊ฒฝ๋กœ๋„ ์œ ์ผํ•˜๋‹ค. (๊ฐ™์€ ๋…ธ๋“œ๋ฅผ ๋‘ ๋ฒˆ ์ด์ƒ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์กฐ๊ฑด ํ•˜์—!)

 

 

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

- ์ด์ง„ ํŠธ๋ฆฌ์—์„œ ๊ฐ ๋…ธ๋“œ๋Š” ์ตœ๋Œ€ 2๊ฐœ์˜ ์ž์‹์„ ๊ฐ€์ง„๋‹ค.

- ๊ฐ๊ฐ์˜ ์ž์‹ ๋…ธ๋“œ๋Š” ์ž์‹ ์ด ๋ถ€๋ชจ์˜ ์™ผ์ชฝ ์ž์‹์ธ์ง€, ์˜ค๋ฅธ์ชฝ ์ž์‹์ธ์ง€๊ฐ€ ์ง€์ •๋œ๋‹ค. (์ž์‹์ด ํ•œ ๋ช…์ธ ๊ฒฝ์šฐ์—๋„!!)

 

 

  • ์ด์ง„ํŠธ๋ฆฌ ์‘์šฉ์˜ ์˜ˆ 1) Expression Tree

(x + y) * ( ( a + b ) / c)

์œ„์˜ ์ด์ง„ํŠธ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์‹์„ ํ‘œํ˜„ํ•œ๋‹ค.

(x + y) * ( ( a + b ) / c)

 

 

 

  • ์ด์ง„ํŠธ๋ฆฌ ์‘์šฉ์˜ ์˜ˆ 2) Huffman Code

: ์–ด๋–ค ํ…Œ์ดํ„ฐ๋ฅผ ์••์ถ•/์ธ์ฝ”๋”ฉํ•˜๋Š” ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ค‘ ํ•˜๋‚˜์ด๋‹ค.

๊ฐ€๋ณ€ ๊ธธ์ด๋ฅผ ์ธ์ฝ”๋”ฉํ•  ๋•Œ, ์˜ˆ๋ฅผ ๋“ค์–ด ์–ด๋–ค ํ…์ŠคํŠธํŒŒ์ผ์ด ์žˆ๋Š”๋ฐ, ๊ทธ ํŒŒ์ผ์˜ ๋‚ด์šฉ์ด ์•ŒํŒŒ๋ฒณ a~z ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค๊ณ  ํ•  ๋•Œ,

๊ทธ ํŒŒ์ผ์˜ ํฌ๊ธฐ๊ฐ€ ์ตœ์†Œ๊ฐ€ ๋˜๋„๋ก ์ธ์ฝ”๋”ฉํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

ko.wikipedia.org/wiki/%ED%97%88%ED%94%84%EB%A8%BC_%EB%B6%80%ED%98%B8%ED%99%94

 

 

  • Full Binary Tree

- ๋ชจ๋“  ๋…ธ๋“œ๋“ค์ด ๊ฝ‰๊ฝ‰ ์ฐจ ์žˆ๋Š” ํŠธ๋ฆฌ

- ๋†’์ด๊ฐ€ h์ธ Full Binary Tree๋Š” 2^h-1๊ฐœ์˜ ๋…ธ๋“œ๋ฅผ ๊ฐ€์ง„๋‹ค.

- ๋…ธ๋“œ๊ฐ€ N๊ฐœ์ธ Complete Binary Tree์˜ ๋†’์ด๋Š” O(logN)์ด๋‹ค. (๋…ธ๋“œ๊ฐ€ N๊ฐœ์ธ ์ด์ง„ํŠธ๋ฆฌ์˜ ๋†’์ด๋Š” ์ตœ์•…์˜ ๊ฒฝ์šฐ, N์ด ๋  ์ˆ˜๋„ ์žˆ๋‹ค.)

 

 

  • Complete Binary Tree

- ๋งจ ๋งˆ์ง€๋ง‰ ๋ ˆ๋ฒจ์„ ์ œ์™ธํ•œ ๋ชจ๋“  ๋…ธ๋“œ๋“ค์€ ๊ฝ‰๊ฝ‰ ์ฐจ ์žˆ๋‹ค. ๋‹จ ์˜ค๋ฅธ์ชฝ์—์„œ๋ถ€ํ„ฐ ๋นˆ๋‹ค.

- ๋…ธ๋“œ๊ฐ€ N๊ฐœ์ธ Complete Binary Tree์˜ ๋†’์ด๋Š” O(logN)์ด๋‹ค. (๋…ธ๋“œ๊ฐ€ N๊ฐœ์ธ ์ด์ง„ํŠธ๋ฆฌ์˜ ๋†’์ด๋Š” ์ตœ์•…์˜ ๊ฒฝ์šฐ, N์ด ๋  ์ˆ˜๋„ ์žˆ๋‹ค.)

- Heap์ด ์ด์— ํ•ด๋‹นํ•œ๋‹ค.

 

 

  • ์ด์ง„ํŠธ๋ฆฌ์˜ ํ‘œํ˜„ : ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ

- ์—ฐ๊ฒฐ๊ตฌ์กฐ(Linked Structure)์„ ํ‘œํ˜„ํ•  ๋•Œ ์“ด๋‹ค. ๋Œ€ํ‘œ์ ์ธ ์˜ˆ๊ฐ€ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ. (Linked List)

- ๊ฐ ๋…ธ๋“œ์— ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ ํ•„๋“œ์™€ ์™ผ์ชฝ์ž์‹(left)์˜ ์ฃผ์†Œ, ์˜ค๋ฅธ์ชฝ์ž์‹(right)์˜ ์ฃผ์†Œ, ๊ทธ๋ฆฌ๊ณ  ๋ถ€๋ชจ๋…ธ๋“œ(p)์˜ ์ฃผ์†Œ๋ฅผ ์ €์žฅํ•œ๋‹ค. (๋ถ€๋ชจ๋…ธ๋“œ์˜ ์ฃผ์†Œ๋Š” ๋ฐ˜๋“œ์‹œ ํ•„์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ฉด ๋ณดํ†ต ์ƒ๋žตํ•œ๋‹ค..)

 

 

 

  • ์ด์ง„ํŠธ๋ฆฌ์˜ ์ˆœํšŒ (Traversal)

- ์ˆœํšŒ : ์ด์ง„ ํŠธ๋ฆฌ์˜ ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•˜๋Š” ์ผ

- ์ค‘์ˆœ์œ„(in-order) ์ˆœํšŒ

- ์„ ์ˆœ์œ„(pre-order) ์ˆœํšŒ

- ํ›„์ˆœ์œ„(post-order) ์ˆœํšŒ

- ๋ ˆ๋ฒจ์˜ค๋”(level-order) ์ˆœํšŒ

 

์ค‘์ˆœ์œ„, ์„ ์ˆœ์œ„, ํ›„์ˆœ์œ„๋Š” ๋ฃจํŠธ ๋…ธ๋“œ๋ฅผ ๋ช‡ ๋ฒˆ์งธ ๋ฐฉ๋ฌธํ•˜๋Š๋ƒ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.

 

์ค‘์ˆœ์œ„ ์ˆœํšŒ๋Š” ๋ฃจํŠธ๋…ธ๋“œ๋ฅผ ์™ผ์ชฝ๊ณผ ์˜ค๋ฅธ์ชฝ ์ค‘๊ฐ„์— ๋ฐฉ๋ฌธํ•œ๋‹ค.

์„ ์ˆœ์œ„ ์ˆœํšŒ๋Š” ๋ฃจํŠธ๋…ธ๋“œ๋ฅผ ์™ผ์ชฝ, ์˜ค๋ฅธ์ชฝ๋ณด๋‹ค ๊ฐ€์žฅ ๋จผ์ € ๋ฐฉ๋ฌธํ•œ๋‹ค.

ํ›„์ˆœ์œ„ ์ˆœํšŒ๋Š” ๋ฃจํŠธ๋…ธ๋“œ๋ฅผ ์™ผ์ชฝ, ์˜ค๋ฅธ์ชฝ์„ ๋ชจ๋‘ ๋ฐฉ๋ฌธํ•œ ํ›„์— ๋ฐฉ๋ฌธํ•œ๋‹ค.

 

* ์ค‘์ˆœ์œ„ ์ˆœํšŒ

1. ๋จผ์ € ํŠธ๋ฆฌ์˜ ์™ผ์ชฝ์„ inorder๋กœ ์ˆœํšŒํ•˜๊ณ ,

2. ๋ฃจํŠธ๋ฅผ ์ˆœํšŒํ•˜๊ณ ,

3. ํŠธ๋ฆฌ์˜ ์˜ค๋ฅธ์ชฝ์„ inorder๋กœ ์ˆœํšŒํ•œ๋‹ค.

 

๋‹ค์Œ์€ ๊ฐ๊ฐ์„ ํ‘œํ˜„ํ•œ ์˜์‚ฌ์ฝ”๋“œ์ด๋‹ค.

// ์ค‘์ˆœ์œ„ ์ˆœํšŒ
INORDER-TREE-WALK(x){
	if x != null
    	then
        	INORDER-TREE-WALK(left[x])
        	print key[x]
        	then INORDER-TREE-WALK(rignt[x])
}


// ์„ ์ˆœ์œ„ ์ˆœํšŒ
PREORDER-TREE-WALK(x){
	if x != null
    	then
        	print key[x]
        	PREORDER-TREE-WALK(left[x])
            	PREORDER-TREE-WALK(right[x])
}


// ํ›„์ˆœ์œ„ ์ˆœํšŒ
POSTORDER-TREE-WALK(x){
	if x != null
    	then
            POSTORDER-TREE-WALK(left[x])
            POSTORDER-TREE-WALK(rignt[x])
            print key[x]
}

 

 

  • Expression Trees

์œ„์˜ Expression Tree๋ฅผ inorder ์ˆœํšŒํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ถœ๋ ฅ๋œ๋‹ค.

x + y * a + b / c

 

๊ฐ ๋ถ€ํŠธ๋ฆฌ๋ฅผ ์ˆœํšŒํ•  ๋•Œ, ์‹œ์ž‘๊ณผ ์ข…๋ฃŒ์‹œ์— ๊ด„ํ˜ธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์˜ฌ๋ฐ”๋ฅธ ์ˆ˜์‹์ด ์ถœ๋ ฅ๋œ๋‹ค.

(x + y) * ((a + b) / c)

 

Postorder ์ˆœํšŒํ•˜๋ฉด ํ›„์œ„ํ‘œ๊ธฐ์‹์ด ์ถœ๋ ฅ๋œ๋‹ค.

x y + a b + c / *

 

 

  • ๋ ˆ๋ฒจ ์˜ค๋” ์ˆœํšŒ (Level-Order)

- ๋ ˆ๋ฒจ ์ˆœ์œผ๋กœ ๋ฐฉ๋ฌธ, ๋™์ผ ๋ ˆ๋ฒจ์—์„œ๋Š” ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ ์ˆœ์„œ๋กœ ๋ฐฉ๋ฌธํ•œ๋‹ค.

- ํ(queue)๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•œ๋‹ค.

์œ„์˜ ํŠธ๋ฆฌ๋ฅผ ์˜ˆ๋กœ ๋“ค๋ฉด, * + / x y + c a b ์ด๋‹ค.

// Level-Order ์ˆœํšŒ
LEVEL-ORDER-TREE-TRAVERSAL()
	visit the root;
    Q <- root;	// Q is a queue
    while Q is not empty, do
    	V <- dequeue(Q)	// dequeue ๋Š”, ํ์—์„œ ๊บผ๋‚ธ๋‹ค๋Š” ๋œป
        visit children of v;
        enqueue children of v into Q;
    end
end

 

 

๋Œ“๊ธ€