ํŠธ๋ฆฌ(Tree) ์ž๋ฃŒ๊ตฌ์กฐ์™€ ํƒ์ƒ‰

ํŠธ๋ฆฌ(Tree)

  • ๋น„์„ ํ˜• ์ž๋ฃŒ๊ตฌ์กฐ
  • ์›์†Œ๋“ค ๊ฐ„ 1:n์˜ ๊ด€๊ณ„๋ฅผ ๊ฐ€์ง€๋Š” ์ž๋ฃŒ๊ตฌ์กฐ
  • ์›์†Œ๋“ค ๊ฐ„ ๊ณ„์ธต ๊ด€๊ณ„๋ฅผ ๊ฐ€์ง€๋Š” ๊ณ„์ธตํ˜• ์ž๋ฃŒ๊ตฌ์กฐ
  • ์ƒ์œ„ ์›์†Œ์—์„œ ํ•˜์œ„ ์›์†Œ๋กœ ๋‚ด๋ ค๊ฐ€๋ฉฐ ํ™•์žฅ๋˜๋Š” ํŠธ๋ฆฌ(๋‚˜๋ฌด) ๋ชจ์–‘์˜ ๊ตฌ์กฐ
  • ํšŒ์‚ฌ์˜ ์กฐ์ง๋„, ํŒŒ์ผ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ, ๊ธฐ๊ณ„ ํ•™์Šต์—์„œ์˜ ๊ฒฐ์ • ํŠธ๋ฆฌ(decision tree) ๋“ฑ์„ ํ‘œํ˜„

ํŠธ๋ฆฌ์˜ ๊ตฌ์„ฑ ์š”์†Œ ๋ฐ ์šฉ์–ด ์ •๋ฆฌ

๊ตฌ์„ฑ ์š”์†Œ

  • ๋…ธ๋“œ(Node) : ํŠธ๋ฆฌ์˜ ์›์†Œ

    • ๋ฃจํŠธ ๋…ธ๋“œ(root node) : ํŠธ๋ฆฌ์˜ ์‹œ์ž‘ ๋…ธ๋“œ์ธ ์ตœ์ƒ์œ„ ๋…ธ๋“œ
    • ๋ฆฌํ”„ ๋…ธ๋“œ(leaf node) : ์ฐจ์ˆ˜๊ฐ€ 0์ธ ๋…ธ๋“œ, ์ž์‹ ๋…ธ๋“œ๊ฐ€ ์—†๋Š” ๋…ธ๋“œ
    • ํ˜•์ œ ๋…ธ๋“œ(sibling node) : ๊ฐ™์€ ๋ถ€๋ชจ ๋…ธ๋“œ๋ฅผ ๊ฐ–๋Š” ์ž์‹ ๋…ธ๋“œ๋“ค
    • ์กฐ์ƒ ๋…ธ๋“œ : ๊ฐ„์„ ์„ ๋”ฐ๋ผ ๋ถ€๋ชจ ๋…ธ๋“œ๊นŒ์ง€ ์ด๋ฅด๋Š” ๊ฒฝ๋กœ์— ์žˆ๋Š” ๋ชจ๋“  ๋…ธ๋“œ๋“ค
    • ์ž์† ๋…ธ๋“œ : ์„œ๋ธŒ ํŠธ๋ฆฌ์— ์žˆ๋Š” ํ•˜์œ„ ๋ ˆ๋ฒจ์˜ ๋…ธ๋“œ๋“ค
  • ๊ฐ„์„ (Edge) : ๋…ธ๋“œ์™€ ๋…ธ๋“œ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ์„ ์œผ๋กœ ํŠธ๋ฆฌ์—์„œ๋Š” ๋ถ€๋ชจ ๋…ธ๋“œ์™€ ์ž์‹ ๋…ธ๋“œ๋ฅผ ์—ฐ๊ฒฐ
  • ์„œ๋ธŒ ํŠธ๋ฆฌ(subtree) : ๋ถ€๋ชจ ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋œ ์„ ์„ ๋Š์—ˆ์„ ๋•Œ ์ƒ์„ฑ๋˜๋Š” ํŠธ๋ฆฌ

์šฉ์–ด ์ •๋ฆฌ

Tree Degree and Level

  • ์ฐจ์ˆ˜(degree)

    • ๋…ธ๋“œ์˜ ์ฐจ์ˆ˜ : ๋…ธ๋“œ์— ์—ฐ๊ฒฐ๋œ ์ž์‹ ๋…ธ๋“œ์˜ ์ˆ˜
    • ํŠธ๋ฆฌ์˜ ์ฐจ์ˆ˜ : ๋…ธ๋“œ์˜ ์ฐจ์ˆ˜ ์ค‘ ์ตœ๋Œ“๊ฐ’
  • ๋†’์ด(level)

    • ๋…ธ๋“œ์˜ ๋†’์ด : ๋ฃจํŠธ๋กœ๋ถ€ํ„ฐ ๋…ธ๋“œ๊นŒ์ง€ ์ด๋ฅด๋Š” ๊ฐ„์„ ์˜ ์ˆ˜
    • ํŠธ๋ฆฌ์˜ ๋†’์ด : ๋…ธ๋“œ์˜ ๋†’์ด ์ค‘ ์ตœ๋Œ“๊ฐ’

ํŠธ๋ฆฌ์™€ ๊ทธ๋ž˜ํ”„์˜ ์ฐจ์ด์ 

  • ์ˆœํ™˜ ๊ตฌ์กฐ(Cyclic) ๊ด€๊ณ„ ์—ฌ๋ถ€ : ํŠธ๋ฆฌ๋Š” ์ˆœํ™˜ ๊ตฌ์กฐ๋ฅผ ๊ฐ–์ง€ ์•Š๋Š” ๊ทธ๋ž˜ํ”„.
  • ๋ฐฉํ–ฅ : ํŠธ๋ฆฌ๋Š” ๋ถ€๋ชจ ๋…ธ๋“œ์—์„œ ์ž์‹ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋‹จ๋ฐฉํ–ฅ๋งŒ ์กด์žฌํ•œ๋‹ค.
  • ๋ถ€๋ชจ ๋…ธ๋“œ์™€ ๋ฃจํŠธ ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜ : ํŠธ๋ฆฌ๋Š” ๋‹จ ํ•˜๋‚˜์˜ ๋ถ€๋ชจ ๋…ธ๋“œ์™€ ๋ฃจํŠธ ๋…ธ๋“œ๋ฅผ ๊ฐ€์ง„๋‹ค.

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

  • ์ฐจ์ˆ˜๊ฐ€ 2์ธ ํŠธ๋ฆฌ
  • ๊ฐ ๋…ธ๋“œ๊ฐ€ ์ตœ๋Œ€ 2๊ฐœ์˜ ์ž์‹ ๋…ธ๋“œ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ํŠธ๋ฆฌ(์™ผ์ชฝ ์ž์‹ ๋…ธ๋“œ, ์˜ค๋ฅธ์ชฝ ์ž์‹ ๋…ธ๋“œ)
  • ๋ชจ๋“  ๋…ธ๋“œ๋“ค์ด ์ตœ๋Œ€ 2๊ฐœ์˜ ์„œ๋ธŒ ํŠธ๋ฆฌ๋ฅผ ๊ฐ–๋Š” ํŠน๋ณ„ํ•œ ํ˜•ํƒœ์˜ ํŠธ๋ฆฌ

์ด์ง„ ํŠธ๋ฆฌ์˜ ํŠน์„ฑ

  • ๊ณต์ง‘ํ•ฉ๋„ ์ด์ง„ํŠธ๋ฆฌ
  • ์„œ๋ธŒ ํŠธ๋ฆฌ ๊ฐ„ ์ˆœ์„œ(์™ผ์ชฝ, ์˜ค๋ฅธ์ชฝ)๊ฐ€ ์กด์žฌ
  • ๋†’์ด i์—์„œ์˜ ๋…ธ๋“œ์˜ ์ตœ๋Œ€ ๊ฐœ์ˆ˜๋Š” 2^i๊ฐœ
  • ๋†’์ด๊ฐ€ h์ธ ์ด์ง„ ํŠธ๋ฆฌ๊ฐ€ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ์ตœ์†Œ ๋…ธ๋“œ ๊ฐœ์ˆ˜๋Š” h+1๊ฐœ, ์ตœ๋Œ€ ๋…ธ๋“œ ๊ฐœ์ˆ˜๋Š” 2^(h+1) - 1๊ฐœ

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

Binary Tree

ํฌํ™” ์ด์ง„ ํŠธ๋ฆฌ(Full Binary Tree)

  • ๋ชจ๋“  ๋†’์ด์— ๋…ธ๋“œ๊ฐ€ ์ตœ๋Œ€๋กœ ์ฐจ ์žˆ๋Š” ์ด์ง„ ํŠธ๋ฆฌ
  • ๋”ฐ๋ผ์„œ ๋…ธ๋“œ ๊ฐœ์ˆ˜๋Š” ์ด์ง„ ํŠธ๋ฆฌ์˜ ์ตœ๋Œ€ ๋…ธ๋“œ ๊ฐœ์ˆ˜์ธ 2^(h+1) - 1๊ฐœ
  • ๋ฃจํŠธ ๋…ธ๋“œ๋ฅผ 1๋ฒˆ์œผ๋กœ ํ•˜์—ฌ ๋ชจ๋“  ๋…ธ๋“œ๊ฐ€ ์ˆœ์„œ๋Œ€๋กœ ๋…ธ๋“œ ๋ฒˆํ˜ธ๋ฅผ ๊ฐ€์ง

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

  • ๋ฃจํŠธ ๋…ธ๋“œ๋ฅผ 1๋ฒˆ์œผ๋กœ ํ•˜์—ฌ n๊ฐœ์˜ ๋…ธ๋“œ๋ฅผ ๊ฐ–๋Š” ์ด์ง„ ํŠธ๋ฆฌ์—์„œ 1๋ฒˆ๋ถ€ํ„ฐ n๋ฒˆ๊นŒ์ง€ ๋นˆ ์ž๋ฆฌ๊ฐ€ ์—†๋Š” ์ด์ง„ ํŠธ๋ฆฌ
  • ๋‚ฎ์€ ๋†’์ด์—์„œ ์‹œ์ž‘ํ•˜์—ฌ ์™ผ์ชฝ ์ž์‹ ๋…ธ๋“œ๋ถ€ํ„ฐ ์ฑ„์›Œ์•ผ ํ•จ

ํŽธํ–ฅ ์ด์ง„ ํŠธ๋ฆฌ(Skewed Binary Tree)

  • ๋†’์ด h์— ๋Œ€ํ•œ ์ตœ์†Œ ๊ฐœ์ˆ˜์˜ ๋…ธ๋“œ๋ฅผ ๊ฐ€์ง€๋ฉฐ ํ•œ ์ชฝ ๋ฐฉํ–ฅ์˜ ์ž์‹ ๋…ธ๋“œ๋งŒ์„ ๊ฐ€์ง„ ์ด์ง„ ํŠธ๋ฆฌ
  • ๋”ฐ๋ผ์„œ ๋…ธ๋“œ ๊ฐœ์ˆ˜๋Š” ์ด์ง„ ํŠธ๋ฆฌ์˜ ์ตœ์†Œ ๋…ธ๋“œ ๊ฐœ์ˆ˜์ธ h+1๊ฐœ

์ด์ง„ ํŠธ๋ฆฌ ํ‘œํ˜„

๋ฐฐ์—ด์„ ์ด์šฉํ•œ ์ด์ง„ ํŠธ๋ฆฌ ํ‘œํ˜„

n๊ฐœ์˜ ๋…ธ๋“œ๋ฅผ ๊ฐ–๋Š” ์ด์ง„ ํŠธ๋ฆฌ์˜ ๊ฒฝ์šฐ ๋ฃจํŠธ ๋…ธ๋“œ๋ถ€ํ„ฐ ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๊นŒ์ง€ 1๋ฒˆ ~ n๋ฒˆ ๋ฒˆํ˜ธ๋ฅผ ๋งค๊ธด ๋’ค, ๋ฐฐ์—ด์˜ 1๋ฒˆ ์ธ๋ฑ์Šค๋ถ€ํ„ฐ n๋ฒˆ ์ธ๋ฑ์Šค๊นŒ์ง€ ์ˆœ์„œ๋Œ€๋กœ ๋…ธ๋“œ๋ฅผ ์‚ฝ์ž…ํ•˜์—ฌ ๊ตฌํ˜„

  • ๋†’์ด๊ฐ€ h์ธ ์ด์ง„ ํŠธ๋ฆฌ๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๊ฐ€ 2^(h+1)๊ฐ€ ๋˜์–ด์•ผ ํ•จ.

    • ๋ฐฐ์—ด์˜ 1๋ฒˆ ์ธ๋ฑ์Šค๋ถ€ํ„ฐ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์ด์ง„ ํŠธ๋ฆฌ์˜ ์ตœ๋Œ€ ๋…ธ๋“œ ๊ฐœ์ˆ˜์ธ 2^(h+1) - 1๊ฐœ๋ณด๋‹ค 1๊ฐœ ๋งŽ์€ ํฌ๊ธฐ
  • ๋ฐฐ์—ด์„ ์ด์šฉํ•œ ์ด์ง„ ํŠธ๋ฆฌ๋Š” ๊ตฌํ˜„์ด ์‰ฝ์ง€๋งŒ, ๋ฐฐ์—ด ์›์†Œ์— ๋Œ€ํ•œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„ ๋‚ญ๋น„๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Œ

    • ํŽธํ–ฅ ์ด์ง„ ํŠธ๋ฆฌ์˜ ๊ฒฝ์šฐ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฐฐ์—ด์˜ ์˜์—ญ์ด ๋งŽ์•„์ง
  • ํŠธ๋ฆฌ์˜ ์ค‘๊ฐ„์— ์ƒˆ๋กœ์šด ๋…ธ๋“œ๋ฅผ ์‚ฝ์ž…ํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•  ๊ฒฝ์šฐ ๋ฐฐ์—ด์˜ ํฌ๊ธฐ ๋ณ€๊ฒฝ์ด ์–ด๋ ค์›Œ ๋น„ํšจ์œจ์ ์ž„
Java
class CompleteBinaryTree {
    private char[] nodes;         // ํŠธ๋ฆฌ์˜ ๋…ธ๋“œ
    private final int SIZE;       // ๋ฐฐ์—ด์˜ ์‚ฌ์ด์ฆˆ ๊ณ ์ •
    private int lastIndex;        // ๋งˆ์ง€๋ง‰์— ์ถ”๊ฐ€๋œ ๋…ธ๋“œ์˜ ์ธ๋ฑ์Šค

    public CompleteBinaryTree(int size) {
        this.SIZE = size;
        nodes = new char[SIZE+1];          // 1 ~ SIZE ๋ฒˆ์˜ ๋…ธ๋“œ๋“ค์„ ์ €์žฅํ•˜๋Š” ๋ฐฐ์—ด
    }

    public void add(char c) {
        if (lastIndex == SIZE) return;     // ๋ฐฐ์—ด ํฌํ™” ์ƒํƒœ
        nodes[++latIndex] = c;             // ๋ฐฐ์—ด์— ํŠธ๋ฆฌ ๋…ธ๋“œ ์ถ”๊ฐ€
    }
}

๋งํฌ๋ฅผ ์ด์šฉํ•œ ์ด์ง„ ํŠธ๋ฆฌ ํ‘œํ˜„

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

๐Ÿ’ก ์ด์ง„ ํŠธ๋ฆฌ ๋…ธ๋“œ ๋ฒˆํ˜ธ์˜ ์„ฑ์งˆ

  • ๋…ธ๋“œ ๋ฒˆํ˜ธ๊ฐ€ i์ธ ๋…ธ๋“œ์˜ ๋ถ€๋ชจ ๋…ธ๋“œ ๋ฒˆํ˜ธ : i/2
  • ๋…ธ๋“œ ๋ฒˆํ˜ธ๊ฐ€ i์ธ ๋…ธ๋“œ์˜ ์™ผ์ชฝ ์ž์‹ ๋…ธ๋“œ ๋ฒˆํ˜ธ : 2*i
  • ๋…ธ๋“œ ๋ฒˆํ˜ธ๊ฐ€ i์ธ ๋…ธ๋“œ์˜ ์˜ค๋ฅธ์ชฝ ์ž์‹ ๋…ธ๋“œ ๋ฒˆํ˜ธ : 2*i + 1
  • ๋ ˆ๋ฒจ n์ธ ๋…ธ๋“œ์˜ ์‹œ์ž‘ ๋ฒˆํ˜ธ : 2^n
  • ๋ฐฐ์—ด ํ‘œํ˜„๋ฒ•์˜ ํ•œ๊ณ„์ธ ๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„๋ฅผ ๋ง‰์„ ์ˆ˜ ์žˆ๋‹ค. ์ด์ง„ ํŠธ๋ฆฌ์˜ ๋…ธ๋“œ ๊ฐœ์ˆ˜๋งŒํผ ๋…ธ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ๋œ๋‹ค.
  • ํŠน์ • ๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰ํ•˜๊ธฐ ์œ„ํ•ด ๋ฃจํŠธ ๋…ธ๋“œ๋ถ€ํ„ฐ ํƒ์ƒ‰์„ ์‹œ์ž‘ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ํƒ์ƒ‰์ด ๋น„ํšจ์œจ์ ์ด๋‹ค.
Java
// ํŠธ๋ฆฌ์˜ ๋…ธ๋“œ
class Node {
    char data;         // ๋ฐ์ดํ„ฐ ํ•„๋“œ
    Node left;         // ์™ผ์ชฝ ์ž์‹ ๋…ธ๋“œ ๋งํฌ ํ•„๋“œ
    Node right;        // ์˜ค๋ฅธ์ชฝ ์ž์‹ ๋…ธ๋“œ ๋งํฌ ํ•„๋“œ

    public Node(char data) {
        this.data = data;
        left = null;             // ๋ฆฌํ”„ ๋…ธ๋“œ๋ฅผ ์œ„ํ•œ ์ดˆ๊ธฐํ™”
        right = null;            // ๋ฆฌํ”„ ๋…ธ๋“œ๋ฅผ ์œ„ํ•œ ์ดˆ๊ธฐํ™”
    }
}

// ์™„์ „ ์ด์ง„ ํŠธ๋ฆฌ
class LinkedCompleteBinaryTree {
    Node[] binaryTree;

    public LinkedCompleteBinaryTree(int nodeCnt) {
        binaryTree = new Node[nodeCnt+1];                 // ๋…ธ๋“œ ๊ฐœ์ˆ˜ + 1
    }

    public void add(int nodeCnt) {
        for (int i=1; i<=nodeCnt; i++) {
            binaryTree[i] = new Node(i);                  // ๋…ธ๋“œ ์ƒ์„ฑ ๋ฐ ๋ฐ์ดํ„ฐ ์‚ฝ์ž…
        }

        for (int i=1; i<=nodeCnt/2; i++) {
            binaryTree[i].left = binaryTree[2*i];         // ์™ผ์ชฝ ์ž์‹ ๋…ธ๋“œ ์—ฐ๊ฒฐ
            binaryTree[i].right = binaryTree[2*i+1];      // ์˜ค๋Š˜์ชฝ ์ž์‹ ๋…ธ๋“œ ์—ฐ๊ฒฐ
        }
    }
}

ํŠธ๋ฆฌ์˜ ํƒ์ƒ‰

๋น„์„ ํ˜• ์ž๋ฃŒ๊ตฌ์กฐ์ธ ํŠธ๋ฆฌ์—์„œ ๊ฐ ๋…ธ๋“œ๋ฅผ ์ค‘๋ณต๋˜์ง€ ์•Š๊ฒŒ ์™„์ „ ํƒ์ƒ‰ํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋ฒ•

  • ๋ฃจํŠธ ๋…ธ๋“œ์˜ ์ž์‹ ๋…ธ๋“œ๋“ค์„ ์šฐ์„ ์ ์œผ๋กœ ๋ชจ๋‘ ๋ฐฉ๋ฌธํ•œ ๋’ค, ๋ฐฉ๋ฌธํ–ˆ๋˜ ์ž์‹ ๋…ธ๋“œ๋“ค์˜ ์ž์‹๋…ธ๋“œ๋“ค์„ ๋˜ ๋‹ค์‹œ ์ฐจ๋ก€๋Œ€๋กœ ๋ฐฉ๋ฌธํ•˜๋Š” ๋ฐฉ์‹
  • ์ธ์ ‘ํ•œ ๋…ธ๋“œ์— ๋Œ€ํ•œ ํƒ์ƒ‰์ด ๋๋‚˜์•ผ ํ•ด๋‹น ๋…ธ๋“œ๋“ค์˜ ์ธ์ ‘ํ•œ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์„ ์ž… ์„ ์ถœ ํ˜•ํƒœ์˜ ์ž๋ฃŒ๊ตฌ์กฐ์ธ ํ(Queue)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Œ
Java
public void bfs() {
    Queue<Integer> q = new LinkedList<>();      // ํƒ์ƒ‰์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋…ธ๋“œ ์ €์žฅ
    q.offer(1);       // ๋ฃจํŠธ ๋…ธ๋“œ์˜ ์ธ๋ฑ์Šค

    int level = 0, size = 0;

    while(!q.isEmpty()) {
        size = q.size();        // ํ˜„์žฌ ๋†’์ด(๋„ˆ๋น„)์—์„œ์˜ ๋ชจ๋“  ๋…ธ๋“œ ๊ฐœ์ˆ˜

        while(size-->0) {       // ๋†’์ด ๋ณ„ ๋…ธ๋“œ๋“ค์„ ๋‹จ๊ณ„์ ์œผ๋กœ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ์Œ
            int current = q.poll();
            
            System.out.println(current + " ");

            // ์™ผ์ชฝ ์ž์‹ ๋…ธ๋“œ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ํ›„ ํ์— ์‚ฝ์ž…
            if (current*2 <= lastIndex) q.offer(current*2);
            // ์˜ค๋ฅธ์ชฝ ์ž์‹ ๋…ธ๋“œ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ํ›„ ํ์— ์‚ฝ์ž…
            if (current*2+1 <= lastIndex) q.offer(current*2+1);
        }

        level++;     // ํ˜„์žฌ ๋†’์ด, ํ•œ ๋†’์ด(๋„ˆ๋น„) ๋ณ„ ํƒ์ƒ‰์ด ๋๋‚˜๋ฉด ํฌ๊ธฐ ํ•˜๋‚˜์”ฉ ์ฆ๊ฐ€
    }
}
  • ๋ฃจํŠธ ๋…ธ๋“œ์—์„œ ์ถœ๋ฐœํ•˜์—ฌ ํ•œ ๋ฐฉํ–ฅ์œผ๋กœ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ๋กœ๊ฐ€ ์กด์žฌํ•  ๋•Œ๊นŒ์ง€ ๊ณ„์†ํ•ด์„œ ๊นŠ์ด ํƒ์ƒ‰. ๋” ์ด์ƒ ๋ฐฉ๋ฌธํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ๋กœ๊ฐ€ ์—†์œผ๋ฉด ๋งˆ์ง€๋ง‰์œผ๋กœ ๋งŒ๋‚ฌ๋˜ ๊ฐˆ๋ฆผ๊ธธ์ด ์žˆ๋˜ ๋…ธ๋“œ๋กœ ๋Œ์•„์™€ ๋‹ค๋ฅธ ๋ฐฉํ–ฅ์˜ ๋…ธ๋“œ๋ฅผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๊ณ„์†ํ•ด์„œ ๊นŠ๊ฒŒ ํƒ์ƒ‰ํ•˜๋Š” ๋ฐฉ์‹
  • ์ž์‹์˜ ์ž์‹์˜ ์ž์‹ ๋…ธ๋“œ๊นŒ์ง€ ๊นŠ๊ฒŒ ํƒ์ƒ‰ํ–ˆ๋‹ค๊ฐ€ ๋ฐฉ๋ฌธํ•  ๋…ธ๋“œ๊ฐ€ ์—†์„ ๊ฒฝ์šฐ ๋Œ์•„์™€์„œ ๋‹ค๋ฅธ ์ž์‹ ๋…ธ๋“œ๋กœ ๊นŠ๊ฒŒ ๋“ค์–ด๊ฐ€์•ผ ํ•˜๋ฏ€๋กœ ์žฌ๊ท€์ ์œผ๋กœ ๊ตฌํ˜„ํ•˜๊ฑฐ๋‚˜, ํ›„์ž… ์„ ์ถœ ํ˜•ํƒœ์˜ ์ž๋ฃŒ๊ตฌ์กฐ์ธ ์Šคํƒ(Stack)์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Œ
Java
public void dfs(int current) {
    System.out.println(current + " ");      // ์ „์œ„ ์ˆœํšŒ dfs๋กœ, ์ค‘์œ„, ํ›„์œ„ ์ˆœ์œ„์˜ ๊ฒฝ์šฐ ํ˜„์žฌ ๋ผ์ธ์˜ ์œ„์น˜๋งŒ ์ž์‹ ๋…ธ๋“œ ์ค‘๊ฐ„๊ณผ ๋งˆ์ง€๋ง‰์œผ๋กœ ๋ฐ”๊ฟ”์ฃผ๋ฉด ๋จ

    // ์™ผ์ชฝ ์ž์‹ ๋…ธ๋“œ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ํ›„ ์žฌ๊ท€์  ํƒ์ƒ‰
    if (current*2 <= lastIndex) dfs(current*2);
    // ์˜ค๋ฅธ์ชฝ ์ž์‹ ๋…ธ๋“œ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ํ›„ ์žฌ๊ท€์  ํƒ์ƒ‰
    if (current*2+1 <= lastIndex) dfs(current*2+1);
}

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

๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰ ์‹œ ํŠธ๋ฆฌ์˜ ๋…ธ๋“œ๋ฅผ ์ˆœํšŒํ•˜๋Š” ์ˆœ์„œ

์ „์œ„ ์ˆœํšŒ(preorder traversal) : VLR

๋…ธ๋“œ ๋ฐฉ๋ฌธ -> ์™ผ์ชฝ ์ž์‹ -> ์˜ค๋ฅธ์ชฝ ์ž์‹

public void dfsByPreOrder() {
    System.out.print("Preorder : ");
    dfsByPreOrder(1);
    System.out.println();
}
	
private void dfsByPreOrder(int current) {
    // ํ˜„์žฌ ๋…ธ๋“œ ์ฒ˜๋ฆฌ
    System.out.print(nodes[current] + " ");
    // ์™ผ์ชฝ ์ž์‹ ๋…ธ๋“œ ๋ฐฉ๋ฌธ
    if (current*2<=lastIndex) dfsByPreOrder(current*2);
    // ์˜ค๋ฅธ์ชฝ ์ž์‹ ๋…ธ๋“œ ๋ฐฉ๋ฌธ
    if (current*2+1<=lastIndex) dfsByPreOrder(current*2+1);
}

์ค‘์œ„ ์ˆœํšŒ(inorder traversal) : LVR

์™ผ์ชฝ ์ž์‹ -> ๋…ธ๋“œ ๋ฐฉ๋ฌธ -> ์˜ค๋ฅธ์ชฝ ์ž์‹

public void dfsByInOrder() {
    System.out.print("Inorder : ");
    dfsByInOrder(1);
    System.out.println();
}

private void dfsByInOrder(int current) {
    // ์™ผ์ชฝ ์ž์‹ ๋…ธ๋“œ ๋ฐฉ๋ฌธ
    if (current*2<=lastIndex) dfsByInOrder(current*2);
    // ํ˜„์žฌ ๋…ธ๋“œ ์ฒ˜๋ฆฌ
    System.out.print(nodes[current] + " ");
    // ์˜ค๋ฅธ์ชฝ ์ž์‹ ๋…ธ๋“œ ๋ฐฉ๋ฌธ
    if (current*2+1<=lastIndex) dfsByInOrder(current*2+1);
}

ํ›„์œ„ ์ˆœํšŒ(postorder traversal) :LRV

์™ผ์ชฝ ์ž์‹ -> ์˜ค๋ฅธ์ชฝ ์ž์‹ -> ๋…ธ๋“œ ๋ฐฉ๋ฌธ

public void dfsByPostOrder() {
    System.out.print("Postorder : ");
    dfsByPostOrder(1);
    System.out.println();
}

private void dfsByPostOrder(int current) {
    // ์™ผ์ชฝ ์ž์‹ ๋…ธ๋“œ ๋ฐฉ๋ฌธ
    if (current*2<=lastIndex) dfsByPostOrder(current*2);
    // ์˜ค๋ฅธ์ชฝ ์ž์‹ ๋…ธ๋“œ ๋ฐฉ๋ฌธ
    if (current*2+1<=lastIndex) dfsByPostOrder(current*2+1);
    // ํ˜„์žฌ ๋…ธ๋“œ ์ฒ˜๋ฆฌ
    System.out.print(nodes[current] + " ");
}