1. 트리

  • 부모와 자식의 관계로 이루어진 계층 구조
  • 그래프의 한 종류
    • 사이클이 없는 방향 그래프

1.1 용어

  • Root : 트리에서 가장 최상위에 존재하는 노드
  • Child : 어떠한 노드의 자식 노드
  • Parent : 어떠한 노드의 부모 노드
  • Siblings : 같은 부모를 갖는 형제 노드
  • Leaf/Terminal : 자식 노드를 갖지 않는 노드
  • Branch/Internal : 자식 노드를 적어도 1개 이상 갖는 노드
  • Degree : 노드가 가지고 있는 자식 노드의 개수
  • Height : 해당 노드부터 Leaf 노드까지의 가장 긴 거리
  • Level : 트리 각 층의 단계 (루트 노드의 경우 1)

2. 이진 트리(Binary Tree)

  • 공백(0개 노드)이거나 루트와 왼쪽 서브트리, 오른쪽 서브트리로 구성
  • 각 노드가 자식 노드를 최대 2개 가지는 트리

2.1 트리 탐색(Traversal) 방법

  • Pre-Order : Root -> Left -> Right (e.g> +23)
  • In-Order : Left -> Root -> Right (e.g> 2+3)
  • Post-Order : Left -> Right -> Root (e.g> 23+)

2.2 포화 이진 트리(full Binary Tree)

  • 잎(Leaf)이 아닌 노드들은 모두 2개의 자식을 갖는(이진) 트리
  • 깊이가 k이고 노드 수가 2^k-1(k >= 0)인 이진 트리
  • 모든 잎(Leaf)이 같은 Level을 갖는 이진 트리

2.2 완전 이진 트리(Complete Binary Tree)

  • 마지막 레벨을 제외하고 모든 레벨이 완전히 채워져 있으며, 마지막 레벨의 노드는 좌측부터 순서대로 채워지는 이진 트리
    (깊이가 k이고 노드 수가 n인 이진 트리이며, 각 노드들이 갚이 k인 포화 이진 트리에서 1부터 n까지의 번호를 붙인 노드들과 1대1로 일치하는 트리)
  • 포화 이진 트리의 잎(Leaf)을 오른쪽부터 제거하여 얻어진 트리

2.3 이진 탐색 트리(Binary Search Tree)

  • 아래의 조건을 만족하는 이진 트리
    • 중복된 노드가 없어야 한다.
    • 각 노드의 왼쪽 서브트리에는 해당 노드의 값보다 작은 값을 지닌 노드들로 이루어져 있다.
    • 각 노드의 오른쪽 서브트리에는 해당 노드의 값보다 큰 값을 지닌 노드들로 이루어져 있다.
    • 왼쪽 서브트리, 오른쪽 서브트리 또한 이진 탐색 트리이다.
  • 중위 순회(In-Order traversal)를 하면 오름차순으로 정렬된 Key값을 얻을 수 있다.
  • 시간 복잡도
    • 탐색, 삽입, 삭제 : O(h) (h : height)
  • 단점 : 한 쪽으로 치우쳐진 형태일 경우 height가 노드의 개수인 N과 동일하게 되어 시간 복잡도가 O(N)이 된다.

  • 참고)
    • 이진 탐색 트리란, 이진 탐색(binary search)과 연결 리스트(linked list)를 결합한 자료구조의 일종
    • 이진 탐색의 효율적인 탐색 능력을 유지하면서도 빈번한 삽입, 삭제 가능
      • 이진 탐색
        • 탐색 : O(logN)
        • 삽입, 삭제 : 불가능
      • 연결 리스트
        • 탐색 : O(N)
        • 삽입, 삭제 : O(1)

2.4 AVL 트리

  • 이진 탐색 트리(Binary Search Tree)의 일종
  • 왼쪽 서브트리와 오른쪽 서브트리의 높이 차(Balance Factor, BF)가 1이하

2.5 red-black 트리

2.6 heap

  • 최댓값 또는 최솟값이 root에 위치하여 O(1)의 속도로 검색이 가능한 완전 이진 트리
  • Max heap, Min heap
  • Max heap의 경우 부모 노드는 자식보다 무조건 커야 한다. (Min heap은 그 반대)
  • 힙은 트리의 한 종류지만 완전 이진 트리의 특성을 활용하여 배열에 저장하는 것이 더 효율적(인덱스의 규칙 이용)
    • 부모 index가 i일 때, 자식 index는 2i(왼쪽), 2i+1(오른쪽)
    • 자식 index가 i일 때, 부모 index는 i/2
  • 중복 값 허용
  • 삽입(O(logN))
    1. 삽입할 데이터를 완전 이진트리를 만족하는 비어있는 자리에 놓는다.
    2. 새로운 노드와 그것의 부모노드를 계속 비교하여 부모가 더 크다는 조건을 만족할 때까지 반복
  • 삭제(최댓값, 최솟값 삭제, O(logN))
    1. 루트 노드를 삭제한다
    2. 마지막 레벨의 마지막 노드를 루트에 올려 놓는다.
    3. 힙의 조건을 만족할때까지 교환을 반복한다.

2.7 MST(Minimum Spanning Tree)