알고리즘 공부/Binary Tree

트리, 이진 트리

환성 2022. 1. 3. 12:33
728x90

트리란?

트리라는 용어는 아서 케일리의 논문에서 처음으로 사용

“A theorem on trees”. 《The Quarterly Journal of Pure and Applied Mathematics》

스택과 큐, 데크 등의 선형 자료구조로는 표현할 수 없는 자료를 표현하기 위해 만들어진 것

그래프의 일종으로, 여러 노드가 한 노드를 가리킬 수 없는 구조

즉, 부모 노드 밑에 여러 자식 노드가 연결되고, 자식 노드 각각에 다시 자식 노드가 연결되는 재귀적 형태의 자료구조를 말한다.

💡 부모노드 : 루트 노드 방향으로 직접 연결된 노드

    자식노드 : 루트 노드 반대방향으로 직접 연결된 노드

    루트노드 : 트리에서 부모가 없는 최상위 노드, 트리의 시작점

트리의 종류

  • 이진트리
    • 이진트리
    • 이진탐색트리
    • 완전이진트리
    • 포화 이진 트리
  • B-트리
    • 2-3-4 트리
    • B+ 트리

트리의 사용 예

  • 유닉스/윈도우의 디렉토리
  • 허프만 코드 등

 

 

이진트리란?

부모 노드 밑의 자식 노드 개수(=차수, degree)를 최대 2개로 제한하는, 트리의 가장 간단한 형태

이진트리의 순회 방법

전위 순회 : 자신, 왼쪽 자손, 오른쪽 자손 순서로 방문

 

preorder(node)
  print node.value
  if node.left ≠ null then preorder(node.left)
  if node.right ≠ null then preorder(node.right)

중위 순회 : 왼쪽 자손, 자신, 오른쪽 자손 순서로 방문

이진 탐색 트리를 중위 순회하면 정렬된 결과를 얻을 수 있다.

 

 

inorder(node)
  if node.left  ≠ null then inorder(node.left)
  print node.value
  if node.right ≠ null then inorder(node.right)

후위 순회 : 왼쪽 자손, 오른쪽 자손, 자신 순서로 방문

 

postorder(node)
  if node.left  ≠ null then postorder(node.left)
  if node.right ≠ null then postorder(node.right)
  print node.value

레벨 순서 순회 : 노드를 레벨 순서로 방문

= 너비 우선 순회

위의 세 가지 방법은 스택을 활용하여 구현할 수 있는 반면 레벨 순서 순회는 큐를 활용해 구현할 수 있다.

levelorder(root)
  q = empty queue
  q.enqueue(root)
  while not q.empty do
    node := q.dequeue()
    visit(node)
    if node.left ≠ null
      q.enqueue(node.left)
    if node.right ≠ null
      q.enqueue(node.right)

각각 순회들은 서로 다른 동작을 정의하는 서로 다른 기능 → 각각의 장단점이 아닌 활용이 다르다

ex) 후위순회는 폴더 용량을 계산할때 사용

'알고리즘 공부 > Binary Tree' 카테고리의 다른 글

B-트리  (3) 2022.01.04
트리의 활용  (0) 2022.01.04
레드-블랙 트리  (0) 2022.01.04
AVL 트리  (0) 2022.01.03