๊ธ€ ์ž‘์„ฑ์ž: ๊ฐœ๋ฐœํ•˜๋Š” ํ›ˆ์ด

ํŠธ๋ฆฌ์˜ ์ •์˜

๋จผ์ €, ํŠธ๋ฆฌ์— ๋Œ€ํ•ด์„œ ์ •์˜ํ•ด๋ณด๋ฉด, ํŠธ๋ฆฌ๋Š” ๋ช‡๊ฐ€์ง€ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ๊ทธ๋ž˜ํ”„์ž…๋‹ˆ๋‹ค.

 

1) ํŠธ๋ฆฌ์˜ ๊ฐ„์„ ์—๋Š” ๋ฐฉํ–ฅ์ด ์—†์Šต๋‹ˆ๋‹ค. ์ฆ‰, ํŠธ๋ฆฌ๋Š” ๋ฌด๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„์ž…๋‹ˆ๋‹ค. 

2) ํŠธ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ชจ๋“  ๋…ธ๋“œ๋Š” ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ์—ฐ๊ฒฐ ๊ทธ๋ž˜ํ”„์ž…๋‹ˆ๋‹ค. ์—ฐ๊ฒฐ๋œ ๊ฐ„์„  ์ค‘ ํ•˜๋‚˜๋งŒ ์‚ญ์ œํ•ด๋„ ์—ฐ๊ฒฐ ๊ทธ๋ž˜ํ”„๊ฐ€ ๊นจ์ง‘๋‹ˆ๋‹ค.

-> ์—ฌ๊ธฐ์„œ ์—ฐ๊ฒฐ๊ทธ๋ž˜ํ”„๋ž€ ๊ทธ๋ž˜ํ”„์˜ ์ž„์˜์˜ ๋…ธ๋“œ ์‚ฌ์ด์— ํ•ญ์ƒ ๊ฒฝ๋กœ๊ฐ€ ์กด์žฌํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ค ๋…ธ๋“œ๋กœ ๊ฐ€๋Š” ๊ฒฝ๋กœ๊ฐ€ ์—†์–ด์ง€๋ฉด ํ•ด๋‹น ๋…ธ๋“œ๋Š” ํŠธ๋ฆฌ์— ํฌํ•จ๋  ์ˆ˜ ์—†๊ฒ ์ฃ ?

3) ํŠธ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜๋Š” ํ•ญ์ƒ ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜๋ณด๋‹ค ํ•˜๋‚˜ ์ ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์‚ฌ์ดํด์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

 

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

์ด์ง„ ํŠธ๋ฆฌ๋Š” ํŠธ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ฐ ๋…ธ๋“œ๊ฐ€ ์ตœ๋Œ€ ๋‘ ๊ฐœ์˜ ์ž์‹ ๋…ธ๋“œ๋ฅผ ๊ฐ€์ง€๋Š” ํŠธ๋ฆฌ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

 

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

์ด์ง„ ํŠธ๋ฆฌ๋Š” ํ˜•ํƒœ์— ๋”ฐ๋ผ์„œ ๋ช‡ ๊ฐ€์ง€ ์ข…๋ฅ˜๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํฌํ™” ์ด์ง„ ํŠธ๋ฆฌ

ํฌํ™” ์ด์ง„ ํŠธ๋ฆฌ๋Š” ์œ„ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ ๋งˆ์ง€๋ง‰ ๋ฆฌํ”„๋…ธ๋“œ๋ฅผ ๊ฐ€์ง„ ๋ ˆ๋ฒจ์ด ๋…ธ๋“œ๋ฅผ ๋” ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š” ๊ณต๊ฐ„์—†์ด ๊ฐ€๋“ ์ฐจ ์žˆ๋Š” ์ด์ง„ ํŠธ๋ฆฌ๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํฌํ™” ์ด์ง„ ํŠธ๋ฆฌ์˜ ๋…ธ๋“œ ๊ฐœ์ˆ˜๋Š” ํ•ญ์ƒ ํŠธ๋ฆฌ์˜ ๋†’์ด h์— ๋Œ€ํ•ด 2^h - 1 ๊ฐœ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

์™„์ „ ์ด์ง„ ํŠธ๋ฆฌ

์™„์ „ ์ด์ง„ ํŠธ๋ฆฌ๋Š” ๋ชจ๋“  ๋ ˆ๋ฒจ์ด ์™ผ์ชฝ๋ถ€ํ„ฐ ์ฑ„์›Œ์ ธ์žˆ๋Š” ํŠธ๋ฆฌ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์œ„ ๊ทธ๋ฆผ ์ฒ˜๋Ÿผ ํ•œ ๋ ˆ๋ฒจ์ด ๊ฐ€๋“ ์ฑ„์›Œ์ง€์ง€ ์•Š์•„๋„ 8๋ฒˆ ๋…ธ๋“œ๊ฐ€ ๊ฐ€์žฅ ์™ผ์ชฝ์— ์ฑ„์›Œ์ ธ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์™„์ „ ์ด์ง„ ํŠธ๋ฆฌ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

๋ฐ˜๋ฉด์— ์ด๋Ÿฐ ๊ฒฝ์šฐ๋Š” ์™ผ์ชฝ์— ์•„์ง ์ฑ„์›Œ์ง€์ง€ ์•Š์€ ๊ณต๊ฐ„์ด ์žˆ์Œ์—๋„ ์ค‘๊ฐ„๋ถ€ํ„ฐ ๋…ธ๋“œ๊ฐ€ ๋“ค์–ด๊ฐ€์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์™„์ „ ์ด์ง„ ํŠธ๋ฆฌ๊ฐ€ ๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. 

 

๊ฐ€์žฅ ์™ผ์ชฝ๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ ์ฑ„์šฐ๋Š” ์™„์ „ ์ด์ง„ ํŠธ๋ฆฌ ํŠน์„ฑ ๋•Œ๋ฌธ์— ์™„์ „ ์ด์ง„ ํŠธ๋ฆฌ๋Š” ๋ฐฐ์—ด๋กœ ์‰ฝ๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ๋ฐฐ์—ด์˜ 0๋ฒˆ์งธ ์š”์†Œ๋ฅผ ๋น„์›Œ๋‘” ์ฑ„๋กœ 1๋ฒˆ ์ธ๋ฑ์Šค๋ฅผ ๋ฃจํŠธ๋…ธ๋“œ๋กœ ๋งŒ๋“ค๋ฉด ์˜ค๋ฅธ์ชฝ ์ž์‹ ๋…ธ๋“œ๋Š” ํ˜„์žฌ ์ธ๋ฑ์Šค i์— ๋Œ€ํ•ด i * 2 ๋กœ ์ฐพ์•„๊ฐˆ ์ˆ˜ ์žˆ๊ณ , ์˜ค๋ฅธ์ชฝ  ์ž์‹ ๋…ธ๋“œ๋Š” i * 2 + 1 ๋กœ ์ฐพ์•„๊ฐˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŽธํ–ฅ ์ด์ง„ ํŠธ๋ฆฌ

 

ํŽธํ–ฅ ์ด์ง„ ํŠธ๋ฆฌ๋Š” ํŠธ๋ฆฌ์˜ ๋…ธ๋“œ๊ฐ€ ํ•œ์ชฝ ์ž์‹ ๋…ธ๋“œ๋กœ๋งŒ ๊ณ„์† ์—ฐ๊ฒฐ๋˜๋ฉด์„œ ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜๋Š” ์ ์ง€๋งŒ ํŠธ๋ฆฌ์˜ ๋†’์ด๋Š” ์ปค์ง€๋Š” ๋ชจ์Šต์˜ ํŠธ๋ฆฌ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

 

์ด์ง„ ํŠธ๋ฆฌ ์ˆœํšŒ

์ด์ง„ ํŠธ๋ฆฌ๋Š” ํŠธ๋ฆฌ์™€ ํŠธ๋ฆฌ์— ํฌํ•จ๋œ ์„œ๋ธŒ ํŠธ๋ฆฌ๋“ค์˜ ๋ฃจํŠธ ๋…ธ๋“œ๋ฅผ ์–ธ์ œ ๋ฐฉ๋ฌธํ•˜๋Š”์ง€์— ๋”ฐ๋ผ ์„ธ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ํŠธ๋ฆฌ์˜ ์ „์ฒด ๋…ธ๋“œ๋ฅผ ์ˆœํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

 

์ „์œ„ ์ˆœํšŒ

์ „์œ„ ์ˆœํšŒ๋Š” ๋‹ค๋ฅธ ๋…ธ๋“œ๋“ค์„ ๋ฐฉ๋ฌธ ํ•˜๊ธฐ ์ด์ „์— ๋ฃจํŠธ๋…ธ๋“œ๋ฅผ ๋จผ์ € ๋ฐฉ๋ฌธํ•˜๋Š” ์ˆœํšŒ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ๋ฃจํŠธ -> ์™ผ์ชฝ -> ์˜ค๋ฅธ์ชฝ ์ˆœ์œผ๋กœ ํŠธ๋ฆฌ์˜ ๋…ธ๋“œ๋“ค์„ ๋ฐฉ๋ฌธํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์ด ํŠธ๋ฆฌ๋ฅผ ์ „์œ„ ์ˆœํšŒํ•˜๋ฉด A->B->D->E->C->F->G ์˜ ์ˆœ์„œ๋Œ€๋กœ ๋ฐฉ๋ฌธํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋ณด์ด๋“ฏ์ด ์–ด๋–ค ๋…ธ๋“œ์˜ ์„œ๋ธŒํŠธ๋ฆฌ๋ฅผ ์ˆœํšŒํ•  ๋•Œ๋Š” ํ•ด๋‹น ๋…ธ๋“œ์˜ ์™ผ์ชฝ์˜ ๋ชจ๋“  ์„œ๋ธŒํŠธ๋ฆฌ๊ฐ€ ์™„๋ฃŒ๋˜์–ด์•ผ ์˜ค๋ฅธ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ๋ฅผ ์ˆœํšŒํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. 

 

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

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

์œ„ ์˜ˆ์‹œ์™€ ๋™์ผํ•œ ํŠธ๋ฆฌ๋ฅผ ์ค‘์œ„ ์ˆœํšŒํ•˜๊ฒŒ ๋˜๋ฉด D->B->E->A->F->C->G์˜ ์ˆœ์„œ๋Œ€๋กœ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•ฉ๋‹ˆ๋‹ค.

 

ํ›„์œ„ ์ˆœํšŒ

ํ›„์œ„ ์ˆœํšŒ๋Š” ๋ฃจํŠธ ๋…ธ๋“œ๋ฅผ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์œผ๋กœ ๋ฐฉ๋ฌธํ•˜๋Š” ์ˆœํšŒ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์™ผ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ์˜ ํƒ์ƒ‰์ด ํ•ญ์ƒ ์˜ค๋ฅธ์ชฝ๋ณด๋‹ค ์„ ํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ์™ผ์ชฝ->์˜ค๋ฅธ์ชฝ->๋ฃจํŠธ์˜ ์ˆœ์„œ๋Œ€๋กœ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๋™์ผํ•œ ํŠธ๋ฆฌ๋ฅผ ํ›„์œ„ ์ˆœํšŒํ•˜๋ฉด D->E->B->F->G->C->A์˜ ์ˆœ์„œ๋Œ€๋กœ ๋ฐฉ๋ฌธํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์„œ๋ธŒํŠธ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฃจํŠธ ๋…ธ๋“œ๋Š” ์ž์‹ ์˜ ์™ผ์ชฝ๊ณผ ์˜ค๋ฅธ์ชฝ ์ž์‹๋…ธ๋“œ๊ฐ€ ๋ชจ๋‘ ๋ฐฉ๋ฌธ ๋œ ์ดํ›„์— ๋ฐฉ๋ฌธ๋ฉ๋‹ˆ๋‹ค. 

 

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

์ด์ „์— ํž™์„ ๊ตฌํ˜„ํ•˜๋ฉด์„œ ์ด๋ฏธ ์™„์ „ ์ด์ง„ํŠธ๋ฆฌ๋ฅผ ๊ตฌํ˜„ํ–ˆ์ง€๋งŒ, ์ด๋ฒˆ์—๋Š” ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ๋กœ ๊ตฌํ˜„ํ•ด ์ „์œ„, ์ค‘์œ„, ํ›„์œ„ ์ˆœํšŒ๊นŒ์ง€ ๊ตฌํ˜„ํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. 

 

๋ผˆ๋Œ€ ๋งŒ๋“ค๊ธฐ

TreeNode

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

import Foundation

final class TreeNode<T: Comparable> {
    let data: T
    var leftChild: TreeNode?
    var rightChild: TreeNode?
    
    init(data: T) {
        self.data = data
    }
    
    var asString:String { return treeString(self){("\($0.data)",$0.leftChild,$0.rightChild)}  }
}

์ด๋ ‡๊ฒŒ ๊ตฌ์„ฑํ–ˆ๋Š”๋ฐ์š”, data์—๋Š” ํŠธ๋ฆฌ์— ๋‹ด์„ ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์–ด์ฃผ๊ณ , ์ž์‹ ์˜ ์™ผ์ชฝ ์ž์‹ ๋…ธ๋“œ์™€ ์˜ค๋ฅธ์ชฝ ์ž์‹ ๋…ธ๋“œ์˜ ์ฐธ์กฐ๊ฐ’์„ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค.

 

asString ํ”„๋กœํผํ‹ฐ๋Š” ํŠธ๋ฆฌ๋ฅผ ์—„์ฒญ ์˜ˆ์˜๊ฒŒ ์ถœ๋ ฅํ•ด์ฃผ๋Š” treeString ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š”๋ฐ ์ด๊ฑด ์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ์—์„œ ์ง„์งœ ์ž˜ ๋งŒ๋“ค์–ด์ฃผ์‹  ๋ถ„์ด ๊ณ„์…”์„œ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ–ˆ์–ด์š”!

 

์ด ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต๋ณ€์— ๋ฉ”์„œ๋“œ๊ฐ€ ์ •์˜๋˜์–ด ์žˆ๊ตฌ์š”,

 

How to “draw” a Binary Tree in Console?

How can I print a binary tree in Swift so that the input 79561 prints output like this: 7 / \ 5 9 / \ 1 6 I tried to arrange this with some code using For Loops and If Statements bu...

stackoverflow.com

 

์ ์šฉํ•˜๋ฉด ์ด๋ ‡๊ฒŒ ์˜ˆ์˜๊ฒŒ ์ฝ˜์†”์— ํŠธ๋ฆฌ๊ฐ€ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค!

 

๋…ธ๋“œ ์ถ”๊ฐ€

์ด๋ฒˆ ๊ตฌํ˜„์—์„œ๋Š” ๋‹ค๋ฅธ ์—ฐ์‚ฐ์€ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๊ณ (์ด์ง„ ํŠธ๋ฆฌ์— ๋Œ€ํ•ด์„œ๋Š” ์ •ํ˜•ํ™”๋œ ๋ฐฉ๋ฒ•์ด ์—†๊ธฐ ๋•Œ๋ฌธ์—) ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ์—ฐ์‚ฐ๋งŒ ๊ตฌํ˜„ํ•œ ๋’ค์— ์ˆœํšŒ ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ํ˜ธ์ถœ๋งŒ ํ•ด๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. 

 

์™„์ „ ์ด์ง„ํŠธ๋ฆฌ์ด๊ธฐ ๋•Œ๋ฌธ์— ํ•ญ์ƒ ๊ฐ€์žฅ ์™ผ์ชฝ ๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ์–ด์•ผ๊ฒ ์ฃ ?

    private func add(newNode: TreeNode<T>, to node: TreeNode<T>) {
        var queue = Queue<TreeNode<T>> ()
        queue.push(root!)
        
        while !queue.isEmpty {
            let now = queue.pop()
            if now?.leftChild == nil {
                now?.leftChild = newNode
                return
            }
            if now?.rightChild == nil {
                now?.rightChild = newNode
                return
            }
            queue.push(now!.leftChild!)
            queue.push(now!.rightChild!)
        }
    }

๊ทธ๋ž˜์„œ ์ด๋ ‡๊ฒŒ BFS๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํŠธ๋ฆฌ๋ฅผ ์ˆœํšŒํ•ด์ฃผ๊ณ , ์•„์ง ์ž์‹ ๋…ธ๋“œ๊ฐ€ ์™„์ „ํžˆ ์ฑ„์›Œ์ง€์ง€ ์•Š์€ ๋…ธ๋“œ๋ฅผ ๋งŒ๋‚˜๋ฉด ์™ผ์ชฝ ์ž์‹ ๋…ธ๋“œ๋ถ€ํ„ฐ ์ฑ„์›Œ์ฃผ๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค ๊ทธ๋ž˜ํ”„์— ๋Œ€ํ•œ ํฌ์ŠคํŠธ๋ฅผ ์•ˆ์จ์„œ BFS๋ฅผ ์—ฌ๊ธฐ์„œ ์†Œ๊ฐœํ•˜๋Š”๊ฒŒ ๋งž์„๊นŒ ์‹ถ์ง€๋งŒ.. BFS์— ๋Œ€ํ•œ ๋‚ด์šฉ์€ ์—ฌ๊ธฐ์— ์ •๋ฆฌ๋˜์–ด ์žˆ์œผ๋‹ˆ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด์‹œ๊ฒ ๋‹ค๋ฉด ์ฐธ๊ณ ํ•˜์‹œ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์š”!

 

[์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ •๋ฆฌ] ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰(BFS)

Breadth-First Search ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰์œผ๋กœ๋„ ๋ถˆ๋ฆฌ๋Š” BFS ์—ญ์‹œ ๊ทธ๋ž˜ํ”„๋ฅผ ํƒ์ƒ‰ํ•˜๊ธฐ ์œ„ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค. DFS๋Š” ํ•œ ๋…ธ๋“œ์— ๋Œ€ํ•ด์„œ ์ œ์ผ ๊นŠ์ˆ™ํ•œ ์œ„์น˜์— ์žˆ๋Š” ๋ ˆ๋ฒจ๊นŒ์ง€ ๋‚ด๋ ค๊ฐ€ ํƒ์ƒ‰ํ•˜์ง€๋งŒ BFS๋Š” ํ•œ ๋ ˆ๋ฒจ์— ์žˆ๋Š”

jeonyeohun.tistory.com

 

ํŠธ๋ฆฌ ์ˆœํšŒ

ํŠธ๋ฆฌ์˜ ์ˆœํšŒ๋Š” ์žฌ๊ท€์ ์ธ ๋ฐฉ์‹์œผ๋กœ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ƒ๊ฐํ•ด๋ณด๋ฉด ์‚ฌ์‹ค ์™ผ์ชฝ ์ž์‹ ๋…ธ๋“œ๋Š” ํ•ญ์ƒ ์˜ค๋ฅธ์ชฝ ์ž์‹ ๋…ธ๋“œ๋ณด๋‹ค ๋จผ์ € ๋ฐฉ๋ฌธ ๋˜๋‹ˆ, ๋ฃจํŠธ๋…ธ๋“œ๋ฅผ ์–ธ์ œ ๋ฐฉ๋ฌธํ•˜๋Š”์ง€๋งŒ ๋‹ค๋ฅด๊ฒŒ ๊ตฌํ˜„ํ•ด์ฃผ๋ฉด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

๋จผ์ € ์ „์œ„ ์ˆœํšŒ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค!

    private func printPreorder(node: TreeNode<T>?) {
        guard let node = node else { return }
        print(node.data, terminator: " ")
        self.printPreorder(node: node.leftChild)
        self.printPreorder(node: node.rightChild)
    }

์žฌ๊ท€์ ์œผ๋กœ ์ „์œ„ ์ˆœํšŒ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ์ถœ๋ ฅ์„ ํ•ด์ฃผ๋Š”๋ฐ์š”, ๋ฃจํŠธ ๋…ธ๋“œ๋ฅผ ๋จผ์ € ์ถœ๋ ฅํ•ด์ฃผ๊ณ  ์™ผ์ชฝ ์ž์‹ ๋…ธ๋“œ๊ฐ€ ๋ฃจํŠธ ๋…ธ๋“œ์ธ ์„œ๋ธŒํŠธ๋ฆฌ๋กœ ์ด๋™ํ•ด ์ˆœํšŒ๋ฅผ ๋ชจ๋‘ ๋งˆ์นœ๋’ค, ์˜ค๋ฅธ์ชฝ ์ž์‹ ๋…ธ๋“œ๊ฐ€ ๋ฃจํŠธ ๋…ธ๋“œ์ธ ์„œ๋ธŒํŠธ๋ฆฌ๋กœ ์ด๋™ํ•ด ์ˆœํšŒ๋ฅผ ๋งˆ์น˜๊ณ  ๋Œ์•„์˜ค๋Š” ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

์ด๋Ÿฐ ํŠธ๋ฆฌ๊ฐ€ ์žˆ๋‹ค๋ฉด ๋จผ์ € A๋ฅผ ์ถœ๋ ฅํ•ด์ฃผ๊ณ , B๋ฅผ ๋ฃจํŠธ๋กœ ๊ฐ€์ง€๋Š” ์„œ๋ธŒํŠธ๋ฆฌ๋กœ ์ด๋™ํ•  ํ…Œ๋‹ˆ ์žฌ๊ท€์ ์œผ๋กœ ํ˜ธ์ถœ๋œ ์ƒˆ๋กœ์šด ํ•จ์ˆ˜๋Š”

์ด ์„œ๋ธŒํŠธ๋ฆฌ๋ฅผ ๊ฐ€์ง€๊ณ  ๋‹ค์‹œ ๋˜‘๊ฐ™์€ ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด์ œ B๋ฅผ ์ถœ๋ ฅํ•˜๊ณ  ์™ผ์ชฝ ์ž์‹๋…ธ๋“œ๋ฅผ ๋ฃจํŠธ๋กœ ๊ฐ€์ง€๋Š” ์„œ๋ธŒํŠธ๋ฆฌ๋กœ ์žฌ๊ท€ ํ˜ธ์ถœ์„ ํ•˜๋‹ˆ

์ด๋ฒˆ์—” ์ž์‹ ๋…ธ๋“œ๊ฐ€ ์—†๋Š” ๋ฆฌํ”„๋…ธ๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ D๋ฅผ ์ถœ๋ ฅ ํ•˜๊ณ  ์žฌ๊ท€์ ์œผ๋กœ ํ•œ ๋ฒˆ ๋” ํ˜ธ์ถœํ•˜์ง€๋งŒ nil์ด ๋ฃจํŠธ์ด๊ธฐ ๋•Œ๋ฌธ์— ํ•จ์ˆ˜๊ฐ€ ๋ฆฌํ„ด๋˜๋ฉด์„œ ๋ชจ๋“  ์™ผ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ์˜ ์ˆœํšŒ๋ฅผ ๋งˆ์น˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

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

 

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

๋กœ์ง์€ ๋™์ผํ•˜๋‹ˆ ๊ทธ๋ฆผ์€ ์ด์ œ ์ƒ๋žตํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค..

    private func printInorder(node: TreeNode<T>?) {
        guard let node = node else { return }
        self.printInorder(node: node.leftChild)
        print(node.data, terminator: " ")
        self.printInorder(node: node.rightChild)
    }

์ค‘์œ„ ์ˆœํšŒ์˜ ๋กœ์ง์€ ์ „์œ„ ์ˆœํšŒ์™€ ๊ฑฐ์˜ ๋™์ผํ•œ๋ฐ์š”, ๋‹จ์ˆœํžˆ ๋ฃจํŠธ ๋…ธ๋“œ์˜ ์ถœ๋ ฅ์ด ์™ผ์ชฝ ์ž์‹ ๋…ธ๋“œ๋ฅผ ๋ฃจํŠธ๋กœ ๊ฐ€์ง€๋Š” ์„œ๋ธŒํŠธ๋ฆฌ์˜ ์ˆœํšŒ๊ฐ€ ๋ชจ๋‘ ๋๋‚˜์•ผ ์ด๋ฃจ์–ด์ง„๋‹ค๋Š” ๊ฒƒ๋งŒ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. 

ํ›„์œ„ ์ˆœํšŒ

    private func printPostorder(node: TreeNode<T>?) {
        guard let node = node else { return }
        self.printPostorder(node: node.leftChild)
        self.printPostorder(node: node.rightChild)
        print(node.data, terminator: " ")
    }

ํ›„์œ„ ์ˆœํšŒ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ํ›„์œ„ ์ˆœํšŒ๋Š” ์™ผ์ชฝ์™€ ์˜ค๋ฅธ์ชฝ ์ž์‹ ๋…ธ๋“œ์˜ ์ˆœํšŒ๊ฐ€ ๋ชจ๋‘ ๋๋‚œ ๋’ค์— ๋ฃจํŠธ๋…ธ๋“œ๋ฅผ ์ถœ๋ ฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฃจํŠธ๋…ธ๋“œ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์žฌ๊ท€ ํ•จ์ˆ˜์˜ ๊ฐ€์žฅ ๋’ค์— ๋„ฃ์–ด์ฃผ๋Š” ๊ฒƒ๋งŒ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

 

์ „์ฒด ์ฝ”๋“œ

 

 

GitHub - jeonyeohun/Data-Structures-In-Swift: ๐Ÿ‘ท๐Ÿป‍โ™‚๏ธ STL ์™œ ์—†์–ด.. ์Šค์œ„ํ”„ํŠธ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ

๐Ÿ‘ท๐Ÿป‍โ™‚๏ธ STL ์™œ ์—†์–ด.. ์Šค์œ„ํ”„ํŠธ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ. Contribute to jeonyeohun/Data-Structures-In-Swift development by creating an account on GitHub.

github.com

์ž๋ฃŒ๊ตฌ์กฐ ์‹œ๋ฆฌ์ฆˆ์˜ ์ฝ”๋“œ๋“ค์€ ์ด ๋ ˆํฌ์—์„œ ๋ชจ๋‘ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด์š”!