ํŠธ๋ฆฌ ์ˆœํšŒ๋ž€?

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

๋ฃจํŠธ ๋…ธ๋“œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ ์•„๋ž˜๋กœ ๋‚ด๋ ค๊ฐ€๋ฉด์„œ ๊ฐ™์€ ๋ ˆ๋ฒจ์— ์žˆ๋Š” ๋ชจ๋“  ๋…ธ๋“œ๋“ค์„ ๊ฐ€๋กœ์งˆ๋Ÿฌ์„œ ๊ฑฐ์ณ๊ฐ€๋Š” ๋ฐฉ์‹์ด๋‹ค.

๊ตฌํ˜„

  // ๊ธฐ์กด BST์—์„œ ํƒ์ƒ‰ํ•˜๋Š” BFS์ด๋ฏ€๋กœ BST ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๋กœ ์ถ”๊ฐ€
  BFS() {
    // ํƒ์ƒ‰ํ•˜๋ฉด์„œ ์›€์ง์ด๋Š” ์  node
    var node = this.root,
      // ํƒ์ƒ‰ ๊ฒฝ๋กœ๋ฅผ ์ €์žฅํ•˜๋Š” data ๋ฐฐ์—ด
      data = [],
      // ์•ž์œผ๋กœ ํƒ์ƒ‰ํ•  ๊ณณ์„ ๋‹ด์•„๋†“๋Š” queue ๋ฐฐ์—ด
      queue = [];
 
    queue.push(this.root);
    // queue ๋ฐฐ์—ด์ด ๋นŒ ๋•Œ๊นŒ์ง€ ๊ณ„์† ๋ฐ˜๋ณตํ•ด์„œ ํƒ์ƒ‰
    // ๋นˆ ๋ฐฐ์—ด์€ ์ฐธ์˜ ๊ฐ’์„ ๊ฐ€์ง€๋ฏ€๋กœ length๊ฐ€ 0์ผ ๋•Œ falthy๊ฐ’์„ ๊ฐ€์ง€๋Š” ๊ฒƒ์„ ์ด์šฉ
    while (queue.length) {
      node = queue.shift();
      data.push(node.val);
      // ์™ผ์ชฝ๊ณผ ์˜ค๋ฅธ์ชฝ์— ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋…ธ๋“œ๊ฐ€ ์žˆ์œผ๋ฉด ๋ชจ๋‘ queue์— ๋„ฃ์Œ
      if (node.left) queue.push(node.left);
      if (node.right) queue.push(node.right);
    }
    return data;
  }

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

๊นŠ์ด์šฐ์„  ํƒ์ƒ‰์—๋Š” ํƒ์ƒ‰ ์ˆœ์„œ์— ๋”ฐ๋ผ ์„ธ ๊ฐ€์ง€๋กœ ๋‚˜๋‰  ์ˆ˜ ์žˆ๋‹ค. ํƒ์ƒ‰ ์ˆœ์„œ์˜ ์ด๋ฆ„์€ ๊ฐ€์šด๋ฐ, ์ฆ‰ ๋ฃจํŠธ ๋…ธ๋“œ์˜ ์œ„์น˜๊ฐ€ ์–ด๋–ค ์ˆœ์„œ์— ์˜ค๋Š”์ง€์— ๋”ฐ๋ผ ์ „์œ„์ˆœํšŒ, ํ›„์œ„์ˆœํšŒ, ์ค‘์œ„์ˆœํšŒ๋กœ ๋‚˜๋‰˜์–ด์ง„๋‹ค.

2-1. ์ „์œ„ ํƒ์ƒ‰(PreOrder)

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

๊ตฌํ˜„

  DFSPreOrder() {
    // ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฐ์—ด์ธ visited
    var visited = [];
    function traverse(node) {
      //๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ์— ํ•ด๋‹น ๋…ธ๋“œ์˜ ๊ฐ’์„ ์ถ”๊ฐ€
      visited.push(node.val);
      // ์™ผ์ชฝ -> ์˜ค๋ฅธ์ชฝ ์ˆœ์„œ๋Œ€๋กœ ํƒ์ƒ‰์ด๋ฏ€๋กœ ์™ผ์ชฝ๋ถ€ํ„ฐ ์žฌ๊ท€์ ์œผ๋กœ ํ˜ธ์ถœ
      if (node.left) traverse(node.left);
      if (node.right) traverse(right);
    }
    // ๋ฃจํŠธ๋…ธ๋“œ๋ถ€ํ„ฐ ํƒ์ƒ‰์„ ์‹œ์ž‘ํ•˜์—ฌ ์žฌ๊ท€์ ์œผ๋กœ ํŒŒ๊ณ ๋“ค๋ฉฐ ํƒ์ƒ‰
    traverse(this.root);
    return visited;
  }

2-2. ํ›„์œ„ ํƒ์ƒ‰(PostOrder)

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

๊ตฌํ˜„

  DFSPostOrder() {
    // ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฐ์—ด์ธ visited
    var visited = [];
    function traverse(node) {
      // ์™ผ์ชฝ -> ์˜ค๋ฅธ์ชฝ ์ˆœ์„œ๋Œ€๋กœ ํƒ์ƒ‰์ด๋ฏ€๋กœ ์™ผ์ชฝ๋ถ€ํ„ฐ ์žฌ๊ท€์ ์œผ๋กœ ํ˜ธ์ถœ
      if (node.left) traverse(node.left);
      if (node.right) traverse(right);
      //ํ›„์œ„์ˆœ์œ„๋Š” ๋งˆ์ง€๋ง‰์— ๋ฃจํŠธ ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€
      visited.push(node.val);
    }
    // ๋ฃจํŠธ๋…ธ๋“œ๋ถ€ํ„ฐ ํƒ์ƒ‰์„ ์‹œ์ž‘ํ•˜์—ฌ ์žฌ๊ท€์ ์œผ๋กœ ํŒŒ๊ณ ๋“ค๋ฉฐ ํƒ์ƒ‰
    traverse(this.root);
    return visited;
  }

2-3. ์ค‘์œ„ ํƒ์ƒ‰(InOrder)

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

๊ตฌํ˜„

  DFSInOrder() {
    // ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฐ์—ด์ธ visited
    var visited = [];
    function traverse(node) {
      // ์™ผ์ชฝ -> ์˜ค๋ฅธ์ชฝ ์ˆœ์„œ๋Œ€๋กœ ํƒ์ƒ‰์ด๋ฏ€๋กœ ์™ผ์ชฝ๋ถ€ํ„ฐ ์žฌ๊ท€์ ์œผ๋กœ ํ˜ธ์ถœ
      // ๋‹ค๋ฅธ ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ–ˆ์„ ๋ฟ if๋ฌธ๊ณผ ์ž‘๋™ ๋ฐฉ์‹์€ ๊ฐ™์Œ
      node.left && traverse(node.left);
      // ์ค‘์œ„์ˆœ์œ„๋Š” ์ค‘๊ฐ„์— ๋ฃจํŠธ ๋…ธ๋“œ์˜ ๊ฐ’์„ ์ถ”๊ฐ€ํ•œ ๋’ค์— ์˜ค๋ฅธ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ๋กœ ์ด๋™ํ•˜์—ฌ ์žฌ๊ท€์ ์œผ๋กœ ํƒ์ƒ‰
      visited.push(node.val);
      node.right && traverse(right);
    }
    // ๋ฃจํŠธ๋…ธ๋“œ๋ถ€ํ„ฐ ํƒ์ƒ‰์„ ์‹œ์ž‘ํ•˜์—ฌ ์žฌ๊ท€์ ์œผ๋กœ ํŒŒ๊ณ ๋“ค๋ฉฐ ํƒ์ƒ‰
    traverse(this.root);
    return visited;
  }

BFS์™€ DFS์ค‘ ๋ฌด์—‡์ด ๋” ๋‚˜์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ธ๊ฐ€?

๊ฒฐ๋ก ๋ถ€ํ„ฐ ๋งํ•˜์ž๋ฉด ์ƒํ™ฉ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๋‹ค. ์ฆ‰, ํŠธ๋ฆฌ์˜ ํ˜•ํƒœ์— ๋”ฐ๋ผ ์‚ฌ์šฉํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ํšจ์œจ์ ์ธ ๋ฉด์—์„œ ์ฐจ์ด๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

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

BFS์˜ ๊ฒฝ์šฐ

์œ„์™€ ๊ฐ™์€ ๊ทธ๋ฆผ์„ ๋ณด๋ฉด ๋…ธ๋“œ์˜ ์ˆ˜๋Š” 2๋ฐฐ๋งŒํผ ๊ณ„์† ์ฆ๊ฐ€ํ•œ๋‹ค. ์ง€๊ธˆ์€ ์–ผ๋งˆ ์—†์ง€๋งŒ 2์˜ ๊ฑฐ๋“ญ์ œ๊ณฑ์€ ๊ธฐํ•˜๊ธ‰์ˆ˜์ ์œผ๋กœ ์ฆ๊ฐ€ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ ˆ๋ฒจ์ด ๊นŠ์–ด์งˆ์ˆ˜๋ก ๋…ธ๋“œ์˜ ์ˆ˜๋Š” ๋งค์šฐ ๋งŽ์•„์ง„๋‹ค.

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

๋”ฐ๋ผ์„œ ๊ณต๊ฐ„๋ณต์žก๋„์ ์ธ ์ธก๋ฉด์—์„œ ์ด๋Ÿฌํ•œ ํ˜•ํƒœ์˜ ํŠธ๋ฆฌ๋Š” BFS๊ฐ€ ํšจ์œจ์ ์ด์ง€ ๋ชปํ•˜๋‹ค.

DFS์˜ ๊ฒฝ์šฐ

DFS์˜ ๊ฒฝ์šฐ์—๋Š” ์ „์— ๋งํ–ˆ๋˜ ๋…ธ๋‹ต ์ด์ง„ํŠธ๋ฆฌ์ฒ˜๋Ÿผ ํ•œ ์ค„๋กœ ์ด์–ด์ ธ์žˆ๋Š” ์ด์ง„ํŠธ๋ฆฌ๊ฐ€ ํšจ์œจ์ ์ด์ง€ ๋ชปํ•˜๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰์„ ํ•˜๊ฒŒ ๋  ๊ฒฝ์šฐ ๋ฌด์กฐ๊ฑด ๊ณ„์† ๋ ๋ ˆ๋ฒจ๊นŒ์ง€ ์žฌ๊ท€์ ์œผ๋กœ ํ˜ธ์ถœํ•˜๋ฉด์„œ ๊ทธ ์ „ ๋ ˆ๋ฒจ๊นŒ์ง€๋Š” ๋ชจ๋‘ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋˜์–ด ์žˆ์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ณต๊ฐ„๋ณต์žก๋„์ ์ธ ์ธก๋ฉด์—์„œ ํšจ์œจ์„ฑ์ด ๋–จ์–ด์ง„๋‹ค.

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

DFS์—์„œ ์„œ๋กœ ๋‹ค๋ฅธ ์ข…๋ฅ˜์˜ ํƒ์ƒ‰์„ ์–ธ์ œ ์‹œํ–‰ํ•ด์•ผ ํ•˜๋Š”๊ฐ€?

์‚ฌ์‹ค ์—ฌ๊ธฐ์—๋„ ๋ช…ํ™•ํ•œ ๋‹ต์€ ์—†๋‹ค. ์ƒํ™ฉ์— ๋”ฐ๋ผ ๋‹ค๋ฅผ ๋ฟ์ด๋‹ค

์ค‘์œ„์ˆœํšŒ(Inorder)์˜ ๊ฒฝ์šฐ

์ค‘์œ„์ˆœํšŒ์˜ ๊ฒฝ์šฐ ํŠธ๋ฆฌ์˜ ๊ฐ’๋“ค์„ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•  ๋•Œ ์œ ์šฉํ•˜๊ฒŒ ์“ฐ์ธ๋‹ค. DFS๋Š” ์ด์ง„ํƒ์ƒ‰ํŠธ๋ฆฌ, ์ฆ‰ BST ํŠธ๋ฆฌ์— ์“ฐ์ด๋Š” ํƒ์ƒ‰ ๋ฐฉ๋ฒ•์ด๋ฏ€๋กœ ํƒ์ƒ‰์„ ํ•  ๋•Œ ์™ผ์ชฝ-์ค‘์•™-์˜ค๋ฅธ์ชฝ ์ˆœ์ด ๊ณง ์˜ค๋ฆ„์ฐจ์ˆœ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ „์œ„์ˆœํšŒ(Preorder)์˜ ๊ฒฝ์šฐ

์ „์œ„์ˆœํšŒ์˜ ๊ฒฝ์šฐ ํŠธ๋ฆฌ๋ฅผ ๋ณต์‚ฌํ•˜๊ฑฐ๋‚˜ ํ‰ํƒ„ํ™”ํ•ด์„œ ํŒŒ์ผ์ด๋‚˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋“ฑ์— ์ €์žฅํ•˜๋Š” ๊ฒฝ์šฐ์— ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค. ์ˆœ์„œ๋Œ€๋กœ ์ž์‹์„ ๋˜‘๊ฐ™์€ ์ „์œ„์ˆœํšŒ ์‹์œผ๋กœ ๋„ฃ์–ด์ฃผ๋ฉด ๋‹ค์‹œ๊ธˆ ํŠธ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•˜๊ธฐ ์šฉ์ดํ•ด์ง„๋‹ค.