Home > Algorithm > 2024 > πŸ“¦[DS,Algorithm] μ™„μ „ 이진 트리(Complete Binary Tree)

πŸ“¦[DS,Algorithm] μ™„μ „ 이진 트리(Complete Binary Tree)
DataStructure Algorithm

1️⃣ μ™„μ „ 이진 트리(Complete Binary Tree).

μ™„μ „ 이진 트리(Complete Binary Tree)λŠ” 이진 트리의 ν•œ μ’…λ₯˜μž…λ‹ˆλ‹€.

1️⃣ μ™„μ „ 이진 트리(Complete Binary Tree)의 νŠΉμ„±.

  1. λͺ¨λ“  레벨이 μ™„μ „νžˆ μ±„μ›Œμ Έ μžˆλ‹€.
    • λ§ˆμ§€λ§‰ λ ˆλ²¨μ„ μ œμ™Έν•œ λͺ¨λ“  레벨의 λ…Έλ“œκ°€ μ΅œλŒ€ 개수둜 μ±„μ›Œμ Έ μžˆμŠ΅λ‹ˆλ‹€.
    • λ§ˆμ§€λ§‰ 레벨의 λ…Έλ“œλ“€μ€ μ™Όμͺ½λΆ€ν„° 였λ₯Έμͺ½μœΌλ‘œ μ±„μ›Œμ Έ μžˆμŠ΅λ‹ˆλ‹€.
  2. λ…Έλ“œμ˜ 배치
    • 트리의 높이가 β€˜h’ 라면, λ§ˆμ§€λ§‰ λ ˆλ²¨μ„ μ œμ™Έν•œ λͺ¨λ“  λ ˆλ²¨μ—λŠ” β€˜2^k’ 개의 λ…Έλ“œκ°€ μžˆμŠ΅λ‹ˆλ‹€. μ—¬κΈ°μ„œ β€˜k’ λŠ” ν•΄λ‹Ή 레벨의 깊이 μž…λ‹ˆλ‹€.
    • λ§ˆμ§€λ§‰ λ ˆλ²¨μ—λŠ” 1개 이상 β€˜2^h’ 개 μ΄ν•˜μ˜ λ…Έλ“œκ°€ 있으며, 이 λ…Έλ“œλ“€μ€ μ™Όμͺ½λΆ€ν„° μ±„μ›Œμ§‘λ‹ˆλ‹€.

2️⃣ μ™„μ „ 이친 트리의 예.

        1
      /   \
     2     3
    / \   / \
   4   5 6   7
  / \
 8   9

μœ„μ˜ νŠΈλ¦¬λŠ” μ™„μ „ 이진 트리의 μ˜ˆμž…λ‹ˆλ‹€.

λͺ¨λ“  레벨이 μ™„μ „νžˆ μ±„μ›Œμ Έ 있고, λ§ˆμ§€λ§‰ 레벨의 λ…Έλ“œλ“€μ€ μ™Όμͺ½λΆ€ν„° 였λ₯Έμͺ½μœΌλ‘œ μ±„μ›Œμ ΈμžˆμŠ΅λ‹ˆλ‹€.

3️⃣ μ™„μ „ 이진 트리의 속성.

  1. λ…Έλ“œ 수
    • 높이가 β€˜h’ 인 μ™„μ „ 이진 νŠΈλ¦¬λŠ” μ΅œλŒ€ β€˜2^(h+1) - 1’ 개의 λ…Έλ“œλ₯Ό κ°€μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€.
    • λ§ˆμ§€λ§‰ λ ˆλ²¨μ„ μ œμ™Έν•œ λͺ¨λ“  λ…Έλ“œλŠ” β€˜2^h - 1’ 개의 λ…Έλ“œλ₯Ό κ°€μ§‘λ‹ˆλ‹€.
  2. 높이
    • λ…Έλ“œ μˆ˜κ°€ β€˜n’ 인 μ™„μ „ 이진 트리의 λ†’μ΄λŠ” β€˜O(log n)’ μž…λ‹ˆλ‹€.
  3. λ°°μ—΄ ν‘œν˜„
    • μ™„μ „ 이진 νŠΈλ¦¬λŠ” 배열을 μ‚¬μš©ν•˜μ—¬ μ‰½κ²Œ ν‘œν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” νž™ μžλ£Œκ΅¬μ‘°μ—μ„œ 많이 μ‚¬μš©λ©λ‹ˆλ‹€.

4️⃣ 배열을 ν†΅ν•œ μ™„μ „ 이진 트리 ν‘œν˜„

μ™„μ „ 이진 νŠΈλ¦¬λŠ” 배열을 μ‚¬μš©ν•˜μ—¬ 효율적으둜 ν‘œν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λ…Έλ“œμ˜ 인덱슀λ₯Ό κΈ°μ€€μœΌλ‘œ λΆ€λͺ¨-μžμ‹ 관계λ₯Ό μ‰½κ²Œ νŒŒμ•…ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λ…Έλ“œμ˜ 인덱슀 κ·œμΉ™

  • 루트 λ…Έλ“œ : 인덱슀 0
  • 인덱슀 β€˜iβ€™μ˜ 였λ₯Έμͺ½ μžμ‹ λ…Έλ“œ : β€˜2*i + 1’
  • 인덱슀 β€˜iβ€™μ˜ λΆ€λͺ¨ λ…Έλ“œ : β€˜(i - 1) / 2’

5️⃣ 예제 μ½”λ“œ

μ•„λž˜λŠ” μ™„μ „ 이진 트리λ₯Ό λ°°μ—΄λ‘œ ν‘œν˜„ν•˜κ³ , 이λ₯Ό 좜λ ₯ν•˜λŠ” κ°„λ‹¨ν•œ 예제 μ½”λ“œμž…λ‹ˆλ‹€.

public class CompleteBinaryTree {

  public static void main(String[] args) {
    int[] tree = {1, 2, 3, 4, 5, 6, 7, 8, 9};

    // 트리 좜λ ₯
    printTree(tree);
  }

  // λ°°μ—΄λ‘œ ν‘œν˜„λœ μ™„μ „ 이진 트리 좜λ ₯
  public static void printTree(int[] tree) {
    for (int i = 0; i < tree.length; i++) {
      int leftChildIndex = 2 * i + 1;
      int rightChildIndex = 2 * i + 2;

      System.out.print("Node " + tree[i] + ": ");

      if (leftChildIndex < tree.length) {
        System.out.print("Left Child: " + tree[leftChildIndex] + ", ");
      } else {
        System.out.print("Left Child: null, ");
      }

      if (rightChildIndex < tree.length) {
        System.out.print("Right Child: " + tree[rightChildIndex]);
      } else {
        System.out.print("Right Child: null");
      }
      System.out.println();
    }
  }
}

/* 좜λ ₯
Node 1: Left Child: 2, Right Child: 3
Node 2: Left Child: 4, Right Child: 5
Node 3: Left Child: 6, Right Child: 7
Node 4: Left Child: 8, Right Child: 9
Node 5: Left Child: null, Right Child: null
Node 6: Left Child: null, Right Child: null
Node 7: Left Child: null, Right Child: null
Node 8: Left Child: null, Right Child: null
Node 9: Left Child: null, Right Child: null
*/

μ„€λͺ…

  1. 트리 λ°°μ—΄ μ΄ˆκΈ°ν™” : int[] tree = {1, 2, 3, 4, 5, 6, 7, 8, 9};
    • μ™„μ „ 이진 트리λ₯Ό λ°°μ—΄λ‘œ ν‘œν˜„ν•©λ‹ˆλ‹€.
  2. 트리 좜λ ₯ : printTree(tree)
    • λ°°μ—΄λ‘œ ν‘œν˜„λœ μ™„μ „ 이진 트리λ₯Ό 좜λ ₯ν•˜λŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€.
    • 각 λ…Έλ“œμ— λŒ€ν•΄ μ™Όμͺ½ μžμ‹κ³Ό 였λ₯Έμͺ½ μžμ‹μ„ 좜λ ₯ν•©λ‹ˆλ‹€.

μ‹œκ°„ λ³΅μž‘λ„

  • μ‚½μž…(Insertion) : O(log n)
  • μ‚­μ œ(Deletion) : O(log n)
  • 탐색(Search) : O(n) (일반적으둜 μ™„μ „ 이진 νŠΈλ¦¬λŠ” 탐색보닀 μ‚½μž…/μ‚­μ œκ°€ 주된 μ—°μ‚°μž…λ‹ˆλ‹€.)

μ™„μ „ 이진 νŠΈλ¦¬λŠ” λ°μ΄ν„°μ˜ ꡬ쑰적 νŠΉμ„± λ•Œλ¬Έμ— νž™κ³Ό 같은 μžλ£Œκ΅¬μ‘°μ—μ„œ 많이 μ‚¬μš©λ©λ‹ˆλ‹€.
μ΄λŠ” 효율적인 μ‚½μž… 및 μ‚­μ œ 연산을 μ œκ³΅ν•˜λ©°, 배열을 ν†΅ν•œ ν‘œν˜„μ΄ κ°„νŽΈν•˜μ—¬ λ‹€μ–‘ν•œ μ•Œκ³ λ¦¬μ¦˜μ—μ„œ μœ μš©ν•˜κ²Œ μ‚¬μš©λ©λ‹ˆλ‹€.