๐Ÿ–ฅ๏ธ CS/์ž๋ฃŒ๊ตฌ์กฐ

[์ž๋ฃŒ๊ตฌ์กฐ] ํŠธ๋ฆฌ(Tree)์™€ ์ด์ง„ ํŠธ๋ฆฌ(Binary Tree)

kiuun 2024. 4. 4. 15:28

ํŠธ๋ฆฌ (Tree)

๋…ธ๋“œ(Node)์™€ ๊ฐ„์„ (Edge)๋กœ ์ด๋ฃจ์–ด์ง„ ๋น„์„ ํ˜• ์ž๋ฃŒ๊ตฌ์กฐ

 

ํŠธ๋ฆฌ์˜ ์šฉ์–ด

๊ตฌ๋ถ„ ์„ค๋ช…
๊ฐ„์„ (Edge) ๋‘ ๋…ธ๋“œ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ์„ (๋งํฌ)
๋…ธ๋“œ(Node) ํŠธ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ธฐ๋ณธ ์›์†Œ
๋ฃจํŠธ ๋…ธ๋“œ(Root) ํŠธ๋ฆฌ์˜ ์ตœ ์ƒ์œ„ ๋…ธ๋“œ
๋ฆฌํ”„ ๋…ธ๋“œ(Leaf) ์ž์‹ ๋…ธ๋“œ๊ฐ€ ์—†๋Š” ๋…ธ๋“œ
ํ˜•์ œ ๋…ธ๋“œ(Sibling) ๊ฐ™์€ ๋ถ€๋ชจ๋ฅผ ๊ฐ–๋Š” ๋…ธ๋“œ
๋…ธ๋“œ์˜ ํฌ๊ธฐ(Size) ์ž์‹ ์„ ํฌํ•จํ•œ ๋ชจ๋“  ์ž์‹ ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜
๋…ธ๋“œ์˜ ๊นŠ์ด(depth) ๋ฃจํŠธ์—์„œ ์–ด๋–ค ๋…ธ๋“œ์— ๋„๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด ๊ฑฐ์ณ์•ผ ํ•˜๋Š” ๊ฐ„์„ ์˜ ์ˆ˜
๋…ธ๋“œ์˜ ๋ ˆ๋ฒจ(Level) ํŠธ๋ฆฌ์˜ ํŠน์ • ๊นŠ์ด๋ฅผ ๊ฐ€์ง€๋Š” ๋…ธ๋“œ์˜ ์ง‘ํ•ฉ
๋…ธ๋“œ์˜ ์ฐจ์ˆ˜(Degree) ๊ฐ ๋…ธ๋“œ์˜ ์ž์‹ ๋…ธ๋“œ ๊ฐœ์ˆ˜
ํŠธ๋ฆฌ์˜ ์ฐจ์ˆ˜(Degree of Tree) ํŠธ๋ฆฌ์˜ ์ตœ๋Œ€ ์ฐจ์ˆ˜
ํŠธ๋ฆฌ์˜ ๋†’์ด(Height) ๋ฃจํŠธ ๋…ธ๋“œ์—์„œ ๊ฐ€์žฅ ๊นŠ์ˆ™์ด ์žˆ๋Š” ๋…ธ๋“œ์˜ ๊นŠ์ด

 

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

  • ๋ถ€๋ชจ-์ž์‹ ๊ด€๊ณ„์˜ ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง„๋‹ค.
  • ๋ฃจํŠธ ๋…ธ๋“œ๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ๋…ธ๋“œ๋Š” ๋ฐ˜๋“œ์‹œ ํ•˜๋‚˜์˜ ๋ถ€๋ชจ ๋…ธ๋“œ๋ฅผ ๊ฐ€์ง„๋‹ค.
  • ํŠธ๋ฆฌ ๋‚ด์˜ ํŠน์ • ๋…ธ๋“œ์™€ ๋‹ค๋ฅธ ํŠน์ • ๋…ธ๋“œ๊นŒ์ง€์˜ ๊ฒฝ๋กœ๋Š” ๋ฐ˜๋“œ์‹œ ์กด์žฌํ•œ๋‹ค.
  • ๋…ธ๋“œ๊ฐ€ N๊ฐœ์ธ ํŠธ๋ฆฌ๋Š” ํ•ญ์ƒ N-1๊ฐœ์˜ ๊ฐ„์„ ์„ ๊ฐ€์ง„๋‹ค.
  • ์‚ฌ์ดํด์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค.

 

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

์ž์‹์˜ ๋…ธ๋“œ ์ˆ˜๊ฐ€ ๋‘ ๊ฐœ ์ดํ•˜์ธ ํŠธ๋ฆฌ

 

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

์ข…๋ฅ˜ ์„ค๋ช…
์ •์ด์ง„ ํŠธ๋ฆฌ (Full) ์ž์‹ ๋…ธ๋“œ๊ฐ€ 0 ๋˜๋Š” ๋‘ ๊ฐœ์ธ ์ด์ง„ ํŠธ๋ฆฌ
์™„์ „ ์ด์ง„ ํŠธ๋ฆฌ (Complete) - ์™ผ์ชฝ๋ถ€ํ„ฐ ์ฑ„์›Œ์ ธ ์žˆ๋Š” ์ด์ง„ ํŠธ๋ฆฌ
- ๋งˆ์ง€๋ง‰ ๋ ˆ๋ฒจ์„ ์ œ์™ธํ•˜๊ณ  ๋ชจ๋“  ๋ ˆ๋ฒจ์ด ์ฑ„์›Œ์ ธ ์žˆ๋Š” ํ˜•ํƒœ
- ๋งˆ์ง€๋ง‰ ๋ ˆ๋ฒจ์˜ ๊ฒฝ์šฐ ์™ผ์ชฝ๋ถ€ํ„ฐ ์ฑ„์›Œ์ ธ ์žˆ๋Š” ํ˜•ํƒœ
๋ณ€์งˆ ์ด์ง„ ํŠธ๋ฆฌ (Degenerate) ์ž์‹ ๋…ธ๋“œ๊ฐ€ ํ•˜๋‚˜๋ฐ–์— ์—†๋Š” ์ด์ง„ ํŠธ๋ฆฌ
ํฌํ™” ์ด์ง„ ํŠธ๋ฆฌ (Perfect) ๋ชจ๋“  ๋…ธ๋“œ๊ฐ€ ๊ฝ‰ ์ฐจ ์žˆ๋Š” ์ด์ง„ ํŠธ๋ฆฌ
๊ท ํ˜• ์ด์ง„ ํŠธ๋ฆฌ (Balanced) - ์™ผ์ชฝ๊ณผ ์˜ค๋ฅธ์ชฝ ๋…ธ๋“œ์˜ ๋†’์ด ์ฐจ์ด๊ฐ€ 1์ดํ•˜์ธ ์ด์ง„ ํŠธ๋ฆฌ
- map, set์„ ๊ตฌ์„ฑํ•˜๋Š” ๋ ˆ๋“œ ๋ธ”๋ž™ ์ด์ง„ ํŠธ๋ฆฌ

 

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

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

 

์ด์ง„ ํŠธ๋ฆฌ๋ฅผ ์ˆœํšŒํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” ์„ธ ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

  • ์ „์œ„ ์ˆœํšŒ(Pre-Order)
  • ์ค‘์œ„ ์ˆœํšŒ(In-Order)
  • ํ›„์œ„ ์ˆœํšŒ(Post-Order)

์ „์œ„ ์ˆœํšŒ ์ˆœ์„œ(๊ฐ€์šด๋ฐ → ์™ผ์ชฝ → ์˜ค๋ฅธ์ชฝ)

  • Root ๋…ธ๋“œ ๋ฐฉ๋ฌธ
  • ์™ผ์ชฝ ์„œ๋ธŒ ํŠธ๋ฆฌ ์ „์œ„ ์ˆœํšŒ
  • ์˜ค๋ฅธ์ชฝ ์„œ๋ธŒ ํŠธ๋ฆฌ ์ „์œ„ ์ˆœํšŒ
  • F → B → A → D → C → E → G → I → H

์ค‘์œ„ ์ˆœํšŒ ์ˆœ์„œ(์™ผ์ชฝ → ๊ฐ€์šด๋ฐ → ์˜ค๋ฅธ์ชฝ)

  • ์™ผ์ชฝ ์„œ๋ธŒ ํŠธ๋ฆฌ ์ค‘์œ„ ์ˆœํšŒ
  • Root ๋…ธ๋“œ ๋ฐฉ๋ฌธ
  • ์˜ค๋ฅธ์ชฝ ์„œ๋ธŒ ํŠธ๋ฆฌ ์ค‘์œ„ ์ˆœํšŒ
  • A → B → C → D → E → F → G → H → I

ํ›„์œ„ ์ˆœํšŒ ์ˆœ์„œ(์™ผ์ชฝ → ์˜ค๋ฅธ์ชฝ → ๊ฐ€์šด๋ฐ)

  • ์™ผ์ชฝ ์„œ๋ธŒ ํŠธ๋ฆฌ ํ›„์œ„ ์ˆœํšŒ
  • ์˜ค๋ฅธ์ชฝ ์„œ๋ธŒ ํŠธ๋ฆฌ ํ›„์œ„ ์ˆœํšŒ
  • Root ๋…ธ๋“œ ๋ฐฉ๋ฌธ
  • A → C → E → D → B → H → I → G → F

 

์ด์ง„ ํŠธ๋ฆฌ ์ˆœํšŒ ์ฝ”๋“œ ๊ตฌํ˜„

Node.swift

class Node<T: Comparable> {
    var data: T
    var left: Node?
    var right: Node?
    
    init(data: T) {
        self.data = data
    }
}

 

BinaryTree.swift

class BinaryTree<T: Comparable> {
    // ์ „์œ„ ์ˆœํšŒ ์ˆœ์„œ(๊ฐ€์šด๋ฐ → ์™ผ์ชฝ → ์˜ค๋ฅธ์ชฝ)
    func preOrder(node: Node<T>?) {
        guard let node = node else { return }
        
        print(node.data, terminator: " -> ")
        self.preOrder(node: node.left)
        self.preOrder(node: node.right)
    }
    
    // ์ค‘์œ„ ์ˆœํšŒ ์ˆœ์„œ(์™ผ์ชฝ → ๊ฐ€์šด๋ฐ → ์˜ค๋ฅธ์ชฝ)
    func inOrder(node: Node<T>?) {
        guard let node = node else { return }
        
        self.inOrder(node: node.left)
        print(node.data, terminator: " -> ")
        self.inOrder(node: node.right)
    }
    
    // ํ›„์œ„ ์ˆœํšŒ ์ˆœ์„œ(์™ผ์ชฝ → ์˜ค๋ฅธ์ชฝ → ๊ฐ€์šด๋ฐ)
    func postOrder(node: Node<T>?) {
        guard let node = node else { return }
        
        self.postOrder(node: node.left)
        self.postOrder(node: node.right)
        print(node.data, terminator: " -> ")
    }
}

 

์‹คํ–‰ ๊ฒฐ๊ณผ