[Swift] ํŠธ๋ฆฌ(Tree)

Lee Youjinยท2023๋…„ 7์›” 1์ผ
0
post-thumbnail

๐ŸŒฒ ํŠธ๋ฆฌ(Tree)๋ž€?

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

์œ„ ์‚ฌ์ง„์—์„œ ์™ผ์ชฝ์€ ํŠธ๋ฆฌ, ์˜ค๋ฅธ์ชฝ์€ ๊ทธ๋ž˜ํ”„๋‹ค. ๋ˆˆ์— ๋„๋Š” ์ฐจ์ด์ ์€

  • ํŠธ๋ฆฌ๋Š” ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ์ด๋ฃจ๊ณ  ์ˆœํ™˜ํ•˜๋Š” ๊ตฌ์กฐ๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ 
  • ๊ทธ๋ž˜ํ”„๋Š” ๊ณ„์ธต ๊ตฌ์กฐ ์—†์ด ์ˆœํ™˜ํ•˜๋Š” ๊ตฌ์กฐ(์‚ฌ์ดํด)๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ๋‹ค๋Š” ์ 

์ด ๋˜๊ฒ ๋‹ค. ๊ทธ ๋ฐ–์—๋„ ์ฐจ์ด์ ์„ ์ •๋ฆฌํ•ด๋ณด์ž๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

ํŠธ๋ฆฌ๊ทธ๋ž˜ํ”„
๋ฐฉํ–ฅ์„ฑ๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„ (์œ„์—์„œ ์•„๋ž˜๋กœ)๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„, ๋ฌด๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„ ๋ชจ๋‘ ์กด์žฌ
์‚ฌ์ดํด์‚ฌ์ดํด์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ๋น„์ˆœํ™˜ ๊ทธ๋ž˜ํ”„์‚ฌ์ดํด์ด ์žˆ๋Š” ์ˆœํ™˜ ๊ทธ๋ž˜ํ”„, ์‚ฌ์ดํด์ด ์—†๋Š” ๋น„์ˆœํ™˜ ๊ทธ๋ž˜ํ”„ ๋ชจ๋‘ ์กด์žฌ
๋ฃจํŠธ ๋…ธ๋“œ๋‹จ ํ•œ๊ฐœ์˜ ๋ฃจํŠธ ๋…ธ๋“œ ์กด์žฌ๋ฃจํŠธ ๋…ธ๋“œ๋ผ๋Š” ๊ฐœ๋… ์ž์ฒด๊ฐ€ ์—†์Œ
๋ถ€๋ชจ-์ž์‹๋ชจ๋“  ์ž์‹ ๋…ธ๋“œ๋Š” ํ•˜๋‚˜์˜ ๋ถ€๋ชจ ๋…ธ๋“œ๋ฅผ ๊ฐ€์ง
๋ถ€๋ชจ-์ž์‹ ๊ด€๊ณ„ ์กด์žฌ
๋ถ€๋ชจ-์ž์‹์ด๋ผ๋Š” ๊ฐœ๋… ์ž์ฒด๊ฐ€ ์—†์Œ
๋ชจ๋ธ๊ณ„์ธต ๋ชจ๋ธ๋„คํŠธ์›Œํฌ ๋ชจ๋ธ
๊ฐ„์„ ์˜ ์ˆ˜๋…ธ๋“œ ๋‹น ์—ฐ๊ฒฐ๋œ ๊ฐ„์„ ์˜ ์ˆ˜๋Š” ๋ฌด์กฐ๊ฑด 1๊ฐœ ์ด์ƒ
๋…ธ๋“œ๊ฐ€ N์ธ ํŠธ๋ฆฌ๋Š” ํ•ญ์ƒ (N-1)์˜ ๊ฐ„์„ ์„ ๊ฐ€์ง
0๊ฐœ ์ด์ƒ (์—†์–ด๋„ ๋ฌด๋ฐฉ)
๊ทธ๋ž˜ํ”„์— ๋”ฐ๋ผ ๊ฐ„์„ ์˜ ์ˆ˜๊ฐ€ ๋‹ค๋ฆ„
๋ฐฉํ–ฅ์„ฑ๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„ (์œ„์—์„œ ์•„๋ž˜๋กœ)๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„, ๋ฌด๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„ ๋ชจ๋‘ ์กด์žฌ

ํŠธ๋ฆฌ๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

public class TreeNode<T> {
  public var value: T 

  public weak var parent: TreeNode? 
  public var children = [TreeNode<T>]() 

  public init(value: T) {
    self.value = value
  }

  public func addChild(_ node: TreeNode<T>) { /
    children.append(node)
    node.parent = self 
  }
}

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

์ด์ง„ ํŠธ๋ฆฌ๋Š” ๊ฐ ๋…ธ๋“œ์—์„œ ์ตœ๋Œ€ ๋‘ ๊ฐœ์˜ ์ž์‹ ๋…ธ๋“œ๋งŒ ์ง€๋‹ ์ˆ˜ ์žˆ๋Š” ํŠธ๋ฆฌ๋กœ, ์ตœ๋Œ€ ๋ผ๋Š” ๋‹จ์–ด๊ฐ€ ์ค‘์š”ํ•˜๋‹ค. ๊ผญ ๋‘ ๊ฐœ์˜ ์ž์‹ ๋…ธ๋“œ๋ฅผ ๊ฐ€์ง€์ง€ ์•Š์•„๋„ ๋œ๋‹ค! ์ด์ง„ ํŠธ๋ฆฌ ์•ˆ์—์„œ๋„ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํŠธ๋ฆฌ๊ฐ€ ๋‚˜๋‰˜๋Š”๋ฐ, ์ž์„ธํ•œ ๊ฑด ๋ฐ‘์—์„œ ์‚ดํŽด๋ณด๊ฒ ๋‹ค.

ํ’€ ์ด์ง„ ํŠธ๋ฆฌ

๊ฐ ๋…ธ๋“œ๋Š” ์ž์‹ ๋…ธ๋“œ๋ฅผ ๊ฐ–์ง€ ์•Š๋˜์ง€, ์ž์‹ ๋…ธ๋“œ๋ฅผ 2๊ฐœ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค. ๋ง ๊ทธ๋Œ€๋กœ ์ •๋ง ํ’€(full) ์ด์ง„ ํŠธ๋ฆฌ๋‹ค.

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

๋งˆ์ง€๋ง‰ ๋‹จ๊ณ„๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ๋‹จ๊ณ„์˜ ๋…ธ๋“œ๊ฐ€ ์™„์ „ํžˆ ์ฑ„์›Œ์ ธ ์žˆ๋Š” ์ƒํƒœ์˜ ํŠธ๋ฆฌ๋‹ค. ๋งˆ์ง€๋ง‰ ๋‹จ๊ณ„์˜ ๋…ธ๋“œ๋Š” ์ขŒ์ธก๋ถ€ํ„ฐ ์ฑ„์›Œ์ ธ์•ผ ํ•œ๋‹ค๋Š” ์ œ์•ฝ๋„ ์žˆ๋‹ค.

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

๋ชจ๋“  ๋‚ด๋ถ€ ๋…ธ๋“œ๋Š” 2๊ฐœ์˜ ์ž์‹ ๋…ธ๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค. ๋˜ํ•œ ๋ชจ๋“  ์žŽ(leaf) ๋…ธ๋“œ๋ฅผ ๋™์ผํ•œ ๊นŠ์ด๋ฅผ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค.

๊ท ํ˜• ์ด์ง„ ํŠธ๋ฆฌ

๋…ธ๋“œ๊ฐ€ ์‚ญ์ œ๋˜๊ฑฐ๋‚˜ ์‚ฝ์ž…๋  ๊ฒฝ์šฐ ํŽธํ–ฅ๋œ ์ด์ง„ ํŠธ๋ฆฌ๊ฐ€ ๋˜๋Š” ๊ฒƒ์„ ๋ง‰๊ธฐ ์œ„ํ•ด, ์žŽ ๋…ธ๋“œ๊นŒ์ง€์˜ ๊นŠ์ด๋ฅผ ์ž‘๊ฒŒ ์œ ์ง€ํ•˜๋„๋ก ํ•˜๋Š” ํŠธ๋ฆฌ๋‹ค.
ํŽธํ–ฅ๋œ ์ด์ง„ ํŠธ๋ฆฌ๊ฐ€ ๋˜์ง€ ์•Š๋„๋ก ํ•˜๋Š” ์ด์œ ๋Š” ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ์˜ ๊ทœ์น™ ๋•Œ๋ฌธ์ด๋‹ค. ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ์—์„œ๋Š” ๋ถ€๋ชจ ๋…ธ๋“œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์™ผ์ชฝ์— ์žˆ๋Š” ๋…ธ๋“œ๋Š” ๋ถ€๋ชจ ๋…ธ๋“œ๋ณด๋‹ค ์ž‘์•„์•ผ ํ•˜๊ณ , ์˜ค๋ฅธ์ชฝ์— ์žˆ๋Š” ๋…ธ๋“œ๋Š” ๋ถ€๋ชจ ๋…ธ๋“œ๋ณด๋‹ค ์ปค์•ผ ํ•œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ํŠธ๋ฆฌ์˜ ๊นŠ์ด๊ฐ€ ๊นŠ์–ด์ง€๋ฉด ํƒ์ƒ‰ํ•ด์•ผ ํ•˜๋Š” ํšŸ์ˆ˜๊ฐ€ ๋Š˜์–ด๋‚˜๊ณ , ์ด ๊ฒฝ์šฐ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(n) ์ด ๋œ๋‹ค.
์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ๋†’์ด๋ฅผ ์ตœ์†Œ๋กœ ์œ ์ง€ํ•ด์•ผ ํ•˜๊ณ , ์ตœ์†Œ๋กœ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๊ท ํ˜• ์ด์ง„ ํŠธ๋ฆฌ๋ฅผ ์ด์šฉํ•œ๋‹ค. ์ด ๊ฒฝ์šฐ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(logn) ์ด๋‹ค.

์œ„ ์‚ฌ์ง„์€ 15๋ฅผ ์‚ฝ์ž…ํ–ˆ์„ ๋•Œ ์–ด๋–ป๊ฒŒ ๊ท ํ˜• ์ด์ง„ ํŠธ๋ฆฌ์—์„œ ๊นŠ์ด๋ฅผ ์ž‘๊ฒŒ ์œ ์ง€ํ•˜๋Š”์ง€ ๋ณด์—ฌ์ฃผ๋Š” ์˜ˆ์‹œ๋‹ค.

์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ

์œ„์—์„œ๋„ ์ž ๊น ์„ค๋ช…ํ–ˆ๋Š”๋ฐ, ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์กฐ๊ฑด์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ํŠธ๋ฆฌ๋‹ค.

  1. ๋ถ€๋ชจ ๋…ธ๋“œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์™ผ์ชฝ์— ์žˆ๋Š” ์ž์‹ ๋…ธ๋“œ๋Š” ๋ชจ๋‘ ๋ถ€๋ชจ ๋…ธ๋“œ๋ณด๋‹ค ์ž‘์€ ๊ฐ’์„ ๊ฐ€์ง„๋‹ค.
  2. ๋ถ€๋ชจ ๋…ธ๋“œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฅธ์ชฝ์— ์žˆ๋Š” ์ž์‹ ๋…ธ๋“œ๋Š” ๋ชจ๋‘ ๋ถ€๋ชจ ๋…ธ๋“œ๋ณด๋‹ค ํฐ ๊ฐ’์„ ๊ฐ€์ง„๋‹ค.

์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ฑฐ๋‚˜ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•  ๋•Œ, ํŠธ๋ฆฌ์˜ ๊นŠ์ด(depth)๊ฐ€ ์–ผ๋งˆ๋‚˜ ๋˜๋ƒ์— ๋”ฐ๋ผ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(n) ์—์„œ O(logn) ์˜ ๊ฐ’์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค. ์‹œ๊ฐ„๋ณต์žก๋„๋Š” ์œ„์—์„œ ์„ค๋ช…ํ–ˆ์œผ๋‹ˆ ๋„˜์–ด๊ฐ€๊ฒ ๋‹ค.

๐Ÿ” ์ด์ง„ํƒ์ƒ‰ํŠธ๋ฆฌ(BST)์˜ ์ˆœํšŒ ๋ฐฉ์‹

ํŠธ๋ฆฌ๋Š” ํฌ๊ฒŒ ์„ธ ๊ฐœ์˜ ์ˆœํšŒ ๋ฐฉ์‹์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค. ์ด๋•Œ ์ˆœํšŒ ๋ฐฉ์‹์ด๋ž€ ํŠน์ •ํ•œ ์ˆœ์„œ์— ๋”ฐ๋ผ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•˜๋Š” ๊ฒƒ์œผ๋กœ, pre-order, post-order, in-order๊ฐ€ ์žˆ๋‹ค. ์ด๋ฆ„์ด ์ €๋ ‡๊ฒŒ ๋ถ™์—ฌ์ง„ ์ด์œ ๋Š” ๋ฃจํŠธ ๋…ธ๋“œ๋ฅผ ์–ด๋–ค ์ˆœ์„œ๋กœ ๋ฐฉ๋ฌธํ•˜๋ƒ์— ๋”ฐ๋ผ ๋ฐ”๋€Œ๋Š” ๊ฒƒ ๊ฐ™์€๋ฐ, pre-order๋Š” ๋ฃจํŠธ ๋…ธ๋“œ๋ฅผ ๋จผ์ €, in-order๋Š” ๋ฃจํŠธ ๋…ธ๋“œ๋ฅผ ์ค‘๊ฐ„์—, post-order๋Š” ๋ฃจํŠธ ๋…ธ๋“œ๋ฅผ ์ œ์ผ ๋งˆ์ง€๋ง‰์— ๋ฐฉ๋ฌธํ•œ๋‹ค. ์ž์„ธํ•œ ์„ค๋ช…์€ ๋ฐ‘์—์„œ!

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

Pre-order ๋ฐฉ์‹์€ ๋ฃจํŠธ ๋…ธ๋“œ -> ์™ผ์ชฝ ๋…ธ๋“œ -> ์˜ค๋ฅธ์ชฝ ๋…ธ๋“œ ์ˆœ์„œ๋กœ ์„œ๋ธŒํŠธ๋ฆฌ๋ฅผ ๋ฐฉ๋ฌธํ•œ๋‹ค. ์ด ๋•Œ ๋ฐฉ๋ฌธ์€ ์žฌ๊ท€์ ์œผ๋กœ ์ด๋ฃจ์–ด์ง€๋Š”๋ฐ, ์œ„ ์‚ฌ์ง„์„ ๋ณด๋ฉด ๋Œ€๋žต์ ์œผ๋กœ ์–ด๋–ค ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ•œ ๋ฐฉ์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

func PreOrder(node: BinaryTreeNode?) {
    guard let node = node else {
        return
    }
    print(node.value)
    BinaryTreeNode.PreOrder(node: node.leftChild)
    BinaryTreeNode.PreOrder(node: node.rightChild)
}

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

์‚ฌ์ง„์„ ๋ณด๋ฉด ์•Œ๊ฒ ์ง€๋งŒ ๋…ธ๋“œ๊ฐ€ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
In-order ๋ฐฉ์‹์€ ์™ผ์ชฝ ๋…ธ๋“œ -> ๋ฃจํŠธ ๋…ธ๋“œ -> ์˜ค๋ฅธ์ชฝ ๋…ธ๋“œ ์ˆœ์„œ๋กœ ์„œ๋ธŒํŠธ๋ฆฌ๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ๋ฐฉ๋ฌธํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋…ธ๋“œ์˜ ๊ฐ’์€ ์ž‘์€ ๊ฐ’๋ถ€ํ„ฐ ํฐ ๊ฐ’๊นŒ์ง€ ์ •๋ ฌ๋˜์–ด ์ถœ๋ ฅ๋œ๋‹ค.

์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

func InOrder(node: BinaryTreeNode?) {
    guard let node = node else {
        return
    }
    BinaryTreeNode.InOrder(node: node.leftChild)
    print(node.value)
    BinaryTreeNode.InOrder(node: node.rightChild)
}

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

Post-order ๋ฐฉ์‹์€ ์™ผ์ชฝ ๋…ธ๋“œ -> ์˜ค๋ฅธ์ชฝ ๋…ธ๋“œ -> ๋ฃจํŠธ ๋…ธ๋“œ ์ˆœ์„œ๋กœ ์„œ๋ธŒํŠธ๋ฆฌ๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ๋ฐฉ๋ฌธํ•œ๋‹ค.

์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

func PostOrder(node: BinaryTreeNode?) {
    guard let node = node else {
        return
    }
    BinaryTreeNode.PostOrder(node: node.leftChild)
    BinaryTreeNode.PostOrder(node: node.rightChild)
    print(node.value)
}

์ฐธ๊ณ ์ž๋ฃŒ

Binary Trees (Part 4) - Discussing (in) Depth-First Traversals
[์ž๋ฃŒ๊ตฌ์กฐ] ํŠธ๋ฆฌ(Tree)๋ž€
[swift] ํŠธ๋ฆฌ / ๊ทธ๋ž˜ํ”„
[Swift] ์Šคํ„ฐ๋”” 5์ฃผ์ฐจ - ํŠธ๋ฆฌ ๊ตฌ์กฐ ๊ธฐ๋ฐ˜์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜

profile
๊พธ์ค€ํžˆ ๋ฐœ์ „ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

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