πŸ’» Computer Science/- Data Structure, Algorithm

[자료 ꡬ쑰] μžλ°”λ₯Ό μ΄μš©ν•œ 트리의 3κ°€μ§€ 순회 방법 κ΅¬ν˜„ν•˜κΈ° :: Tree Traversal (InOrder, PostOrder, PreOrder)

Wonit 2020. 7. 8. 19:09

트리 자료ꡬ쑰λ₯Ό ν•™μŠ΅ν•˜λŠ” κ°€μž₯ 큰 μ΄μœ λŠ” μ§€λ‚œ μ‹œκ°„μ—μ„œ μ„€λͺ…ν–ˆλ“―이 탐색을 효율적으둜 ν•˜κΈ° μœ„ν•¨ 이라고 ν–ˆλ‹€.

 

이런 트리 νƒμƒ‰ν•˜λŠ”λ°μ— 쑰금 더 효율적이며 체계적인 방법이 μžˆλŠ”λ°, κ·Έ λŒ€ν‘œ 주자 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 κ°•μ˜κ°€ 정말 잘 λ‚˜μ™€μžˆκΈ° λ•Œλ¬Έμ— ν•΄λ‹Ή 유튜브λ₯Ό 보고 ν•™μŠ΅ν•˜λŠ” 것을 λ‚΄ λΈ”λ‘œκ·Έλ₯Ό λ³΄λŠ”κ²ƒ 보닀 훨씬 λ§Žμ΄μΆ”μ²œν•œλ‹€..