๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • ์žฅ์›์ต ๊ธฐ์ˆ ๋ธ”๋กœ๊ทธ
๐Ÿ’ป Computer Science/- Data Structure, Algorithm

[์ž๋ฃŒ ๊ตฌ์กฐ] ์ž๋ฐ”๋ฅผ ์ด์šฉํ•œ ํŠธ๋ฆฌ์˜ 3๊ฐ€์ง€ ์ˆœํšŒ ๋ฐฉ๋ฒ• ๊ตฌํ˜„ํ•˜๊ธฐ :: Tree Traversal (InOrder, PostOrder, PreOrder)

by Wonit 2020. 7. 8.

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

 

์ด๋Ÿฐ ํŠธ๋ฆฌ ํƒ์ƒ‰ํ•˜๋Š”๋ฐ์— ์กฐ๊ธˆ ๋” ํšจ์œจ์ ์ด๋ฉฐ ์ฒด๊ณ„์ ์ธ ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”๋ฐ, ๊ทธ ๋Œ€ํ‘œ ์ฃผ์ž 3๊ฐ€์ง€๋ฅผ ์ด๋ฒˆ ์‹œ๊ฐ„์—๋Š” ์•Œ์•„๋ณด๊ณ  ๊ตฌํ˜„๊นŒ์ง€ ๋งˆ์ณ๋ณด๊ฒ ๋‹ค.

  • InOrder

  • PreOrder

  • PostOrder

  • ๋ ˆ๋ฒจ ์ˆœ์„œ ์ˆœํšŒ (์ด๋ฒˆ์—๋Š” ๋‹ค๋ฃจ์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค)


์ˆœํšŒ

    for(String name : names) {
      name.toString();
    }

๋ฐฐ์—ด์„ ์ธ๋ฑ์Šค 0 ๋ถ€ํ„ฐ ๊ธธ์ด๋งŒํผ ๋ฐ˜๋ณตํ•˜๋Š” ๊ฒƒ์ด Iteration ์ด๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ์ˆœํšŒ๋ฅผ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

์ˆœํšŒ๋ผ๊ณ  ํ•œ๋‹ค๋ฉด ์˜์–ด๋กœ๋Š” Circulation. ๋ฐ”๋กœ ์›์†Œ๋ฅผ ํ•˜๋‚˜ ํ•˜๋‚˜ ํ™•์ธํ•œ๋‹ค๋Š” ๋œป์ด๋‹ค.

 

์šฐ๋ฆฌ๋Š” ์‚ฌ์‹ค ๋งŽ์€ ๋ถ€๋ถ„์—์„œ ์ˆœํšŒ๋ฅผ ๊ฒฝํ—˜ํ•ด ์™”์—ˆ๋‹ค.


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


์ฒœ์ฒœํžˆ ๋ฐฐ์›Œ๋ณด์ž.

 

ํ•ด๋‹น ๊ตฌ์กฐ๋Š” ์•ž์œผ๋กœ ๋ฐฐ์šธ ์ˆœํšŒ ๋ฐฉ๋ฒ•์— ์‚ฌ์šฉ๋  ํŠธ๋ฆฌ์ด๋‹ˆ ์ฐธ๊ณ ํ•˜๊ณ , ํŠธ๋ฆฌ์˜ ์ˆœํšŒ๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์ค€๋น„ํ•œ๋‹ค.

 

 

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

 

InOrder

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

  1. ์™ผ์ชฝ ์ž์‹ ๋…ธ๋“œ
  2. ํ˜„์žฌ ๋…ธ๋“œ
  3. ์˜ค๋ฅธ์ชฝ ์ž์‹ ๋…ธ๋“œ

์œ„์™€ ๊ฐ™์€ ํŠธ๋ฆฌ๊ฐ€ ์กด์žฌํ•  ๋•Œ ์™ผ์ชฝ ์ž์‹์ด ๋…ธ๋“œ๊ฐ€ ์—†์„ ๋•Œ ๊นŒ์ง€ ๋ฐฉ๋ฌธํ•˜๊ณ  ๋…ธ๋“œ๊ฐ€ ์—†๋‹ค๋ฉด ์ถœ๋ ฅํ•œ๋‹ค.

๊ทธ๋Ÿผ ์ด๋ ‡๊ฒŒ ๋‚ด๋ ค๊ฐ€๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค.

 

์ด์™€ ๊ฐ™์€ ๊ณผ์ •์„ ์šฐ๋ฆฌ๋Š” ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์žฌ๊ท€ ํ˜ธ์ถœ์„ ํ†ตํ•ด์„œ ๊ตฌํ˜„ํ•œ๋‹ค.

 

๋…ธ๋“œ๊ฐ€ null์ด ์•„๋‹ ๋•Œ ๊นŒ์ง€ ์žฌ๊ท€ ํ˜ธ์ถœ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

 

InOrder๊ฐ€ ์™ผ์ชฝ ์ž์‹ ๋…ธ๋“œ ๋จผ์ € ์ถœ๋ ฅํ•˜๊ณ  ํ˜„์žฌ ๋…ธ๋“œ ์ถœ๋ ฅ ํ›„ ์˜ค๋ฅธ์ชฝ ์ž์‹์„ ์ถœ๋ ฅํ•˜๋Š” ๊ฒƒ์ด๋‹ˆ ์œ„์™€ ๊ฐ™์€ ์ฝ”๋“œ๊ฐ€ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

PreOrder

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

  1. ํ˜„์žฌ ๋…ธ๋“œ
  2. ์™ผ์ชฝ ์ž์‹ ๋…ธ๋“œ
  3. ์˜ค๋ฅธ์ชฝ ์ž์‹ ๋…ธ๋“œ

ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ ์ถœ๋ ฅํ•˜๊ณ  ์™ผ์ชฝ ์ž์‹ ๋…ธ๋“œ -> ์˜ค๋ฅธ์ชฝ ์ž์‹ ๋…ธ๋“œ ์ˆœ์„œ๋กœ ๋ฐฉ๋ฌธํ•˜๋ฉฐ ์ถœ๋ ฅํ•˜๋Š”๋ฐ ์™ผ์ชฝ ์ž์‹ ๋…ธ๋“œ์˜ ์ž์‹ ๋…ธ๋“œ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์„ ๋•Œ ๊นŒ์ง€ ์•„๋ž˜๋กœ ๊ณ„์† ์žฌ๊ท€ํ˜ธ์ถœํ•œ๋‹ค.

์ด๊ฒƒ ๋˜ํ•œ ๋…ธ๋“œ๊ฐ€ null์ด ์•„๋‹ ๋•Œ ๊นŒ์ง€ ๋ฐ˜๋ณตํ•˜๊ณ  ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ ๋จผ์ € ์ถœ๋ ฅ ํ›„ ์™ผ์ชฝ ์˜ค๋ฅธ์ชฝ์„ ์žฌ๊ท€ ํ˜ธ์ถœ ํ•œ๋‹ค.

PostOrder

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

  1. ํ˜„์žฌ ๋…ธ๋“œ
  2. ์™ผ์ชฝ ์ž์‹ ๋…ธ๋“œ
  3. ์˜ค๋ฅธ์ชฝ ์ž์‹ ๋…ธ๋“œ

๋…ธ๋“œ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์„ ๋•Œ ๊นŒ์ง€ ํ˜„์žฌ ๋…ธ๋“œ์˜ ์™ผ์ชฝ ์ž์‹ -> ์˜ค๋ฅธ์ชฝ ์ž์‹ ํ˜„์žฌ ๋…ธ๋“œ ์ˆœ์„œ๋กœ ์ˆœํšŒํ•˜๋ฉด ๋œ๋‹ค.

์ „์ฒด ์†Œ์Šค ์ฝ”๋“œ

class TraversalNode{
    int data;
    TraversalNode rightNode;
    TraversalNode leftNode;
}

class TraversalTree{
    TraversalNode root;

    TraversalNode getRoot() {
        return root;
    }

    void setRoot(TraversalNode root) {
        this.root = root;
    }

    /*๋…ธ๋“œ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฉ”์„œ๋“œ*/
    void makeNode(int data, TraversalNode left, TraversalNode right){
        TraversalNode node = new TraversalNode();
        node.data = data;
        node.leftNode  = left;
        node.rightNode = right;
    }

    void inOrder(TraversalNode node){

        if (node != null){
            inOrder(node.leftNode);
            System.out.println(node.data);
            inOrder(node.rightNode);
        }
    }

    void preOrder(TraversalNode node){
        if(node != null){
            System.out.println(node.data);
            preOrder(node.leftNode);
            preOrder(node.rightNode);
        }
    }

    void postOrder(TraversalNode node){
        if(node != null){
            postOrder(node.leftNode);
            postOrder(node.rightNode);
            System.out.println(node.data);
        }
    }
}

์ด๋ ‡๊ฒŒ ํŠธ๋ฆฌ์˜ ์ˆœํšŒ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์•˜๋Š”๋ฐ ์ˆœํšŒ ๋ฐฉ๋ฒ•์€ ํƒ์ƒ‰์—๋„ ์ •๋ง ์ค‘์š”ํ•˜๊ณ  ๋‹ค์Œ์— ๊ฐ€์„œ ๊ตฌํ˜„ํ•  BFS, DFS์—๋„ ์ค‘์š”ํ•œ ๊ฐœ๋…์ด ๋œ๋‹ค.

 

์•ˆ ๊ทธ๋ž˜๋„ ์–ด๋ ค์šด BFS, DFS์— ํŠธ๋ฆฌ์˜ ์ˆœํšŒ ๋ฐฉ๋ฒ•๊นŒ์ง€ ์–ด๋ ต๊ฒŒ ๋Š๊ปด์ง„๋‹ค๋ฉด ์ •๋ง ์ง€์˜ฅ์ด ๋  ์ˆ˜ ์žˆ๋‹ค.

 

๊ทธ๋Ÿฌ๋ฏ€๋กœ ์ง€๊ธˆ ๋ฏธ๋ฆฌ ๊ณ ํ†ต์„ ๋ฐ›๊ฒŒ ๋œ๋‹ค๋ฉด ๋‹ค์Œ์ด ํŽธํ•ด์ง„๋‹ค๋Š” ๋งˆ์Œ์œผ๋กœ ํ™•์‹คํžˆ ์•Œ์•„๊ฐ€์ž.

 

์œ ํŠœ๋ธŒ www.youtube.com/watch?v=QN1rZYX6QaA ๊ฐ•์˜๊ฐ€ ์ •๋ง ์ž˜ ๋‚˜์™€์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ์œ ํŠœ๋ธŒ๋ฅผ ๋ณด๊ณ  ํ•™์Šตํ•˜๋Š” ๊ฒƒ์„ ๋‚ด ๋ธ”๋กœ๊ทธ๋ฅผ ๋ณด๋Š”๊ฒƒ ๋ณด๋‹ค ํ›จ์”ฌ ๋งŽ์ด์ถ”์ฒœํ•œ๋‹ค..

๋Œ“๊ธ€