자료구조/이진트리

이진트리

은행털이 2024. 4. 23. 04:27

트리란?

트리는 한 개 이상의 노드(node)로 이루어진 유한 집합으로서

  • 노드 중에는 루트(root)노드가 한 개 있고
  • 나머지 노드들은 n >= 0개의 분리 집합 T1, ...... Tn으로 분할될 수 있다. 여기서 T1, ...... Tn은 각각 하나의 트리이며 루트의 서브트리(subtree)라고 한다

 

트리의 구조

 

  • 차수(degree) : 한 노드가 가지고 있는 서브트리의 수, 차수가 0인 노드는 리프노드(leaf node)
  • 트리의 차수(degree of tree) : 트리의 최대 차수, 트리의 차수가 n이면 해당 트리의 구조를 'n진 트리' 라고 함
  • 간선(edge) : 노드와 노드의 연결선. 노드가 n개이면 엣지는 n - 1개
  • 루트 노드(root node) : 레벨이 1인 노드
  • 리프 노드(leaf node) : 차수가 0인 노드
  • 자식 노드(child node) : 한 노드가 가진 서브트리의 루트 노드, 그림에서 B의 자식노드는 D와 E
  • 부모 노드(parent node) : 자식 노드에서 루트노드 방향으로 직접 연결 된 노드
  • 형제 노드(sibling node) : 같은 부모를 갖는 노드
  • 조상 노드(ancestor node) : 루트에서 해당 노드로 이르는 경로상의 모든 노드
  • 레벨(level) : 루트노드(0 or 1)부터 특정 노드까지 간선의 수, 그림에서 J의 레벨은 3
  • 높이(height) : 트리의 최대 레벨, 루트에서의 경로 중 가장 긴 경로
  • 링크필드(link field) : 다른 노드의 주소를 저장한 공간(포인터), 그림에서 노드 C는 F와 G를 가리키는 포인터를 가짐
    - 노드의 수가 n이고 트리의 차수가 k일 때 총 링크필드의 수는 nk
    - 노드의 수가 n일 때 현재 사용중인 링크필드는 n - 1
    - 노드의 수가 n이고 트리의 차수가 k일 때 사용하지 않는 링크필드의 수는 (k * n) - (n - 1)이므로 (k - 1)n + 1
    - 연결되지 않은, 사용중이지 않은 링크필드는 Null 링크
  • 트리의 효율(tree efficiency) : Null링크의 발생율로 계산 가능. ((k - 1)n + 1) / (nk) * 100
    - k가 2일 때 (n + 1) / (2n) * 100이므로 시간복잡도로 n이 충분히 크다고 가정하면 1/2, 즉 50%의 Null링크가 발생
    - k가 3일 때 (2n + 1) / (3n) * 100이므로 n이 충분히 클 때 2/3, 즉 66.67%의 Null링크가 발생

 

1. 트리의 리스트 표현

(A(B(D, E(I, J), F), C(G(K), H)))

 

 

2. 이진트리

이진트리란 다음의 성질을 만족하는 노드의 집합

  • 공백이거나
  • 루트노드와 서로 분리된 두 개의 이진트리, 즉 왼쪽 부트리와 오른쪽 부트리로 구성됨
  • A의 왼쪽자식이 B인 트리와 A의 오른쪽자식이 B인 트리는, 일반 트리의 관점에서는 같지만 이진트리의 관점에서는 각각 오른쪽 공백과 왼쪽 공백을 가지므로 다른 트리로 봄

 

2-1. 이진트리의 성질

  • 이진트리의 레벨 i에서의 최대 노드 수는 2의 i-1승 개 이다 (i >= 1)
  • 높이가 k인 이진트리의 최대 노드 수는 2^k - 1 개 이다 (k >= 1)
  • 높이가 k이고 노드의 수가  2^k - 1 개인, 모든 노드가 가득 찬 이진트리를 포화이진트리 라고 한다

 

2-2. 이진트리의 종류

  • 편향 이진 트리(skewed binary tree) : 왼쪽 혹은 오른쪽 서브트리만 갖는 이진트리

왼쪽 편향트리와 오른쪽 편향트리

 

  • 완전 이진트리(complete binary tree) : 모든 노드가 위에서 아래로, 왼쪽에서 오른쪽의 순서대로 채워져 있는 트리

완전이진트리

  • 전 이진트리(full binary tree) : 채워져 있는 순서에 상관 없이, 모든 노드가 자식을 0개 혹은 2개를 갖고 있는 이진 트리

해당 트리는 왼쪽부터 채워지지 않았으므로 완전이진트리는 아니지만 모든 노드가 자식을 0개 혹은 2개를 가지므로 전 이진트리에는 해당 됨

  • 포화 이진트리(perfect binary tree) : 높이가 k일 때(k >= 1) 2^k - 1개의 노드(최대 노드의 수만큼)를 가지는 트리

포화 이진트리, k = 3, 2^k-1 = 7