[Tree] - 이진 트리와 이진 탐색 트리

Donggu(oo)·2023년 1월 13일
0
post-thumbnail
post-custom-banner

1. 이진 트리(Binary tree)


  • 이진 트리(Binary tree)란 각각의 노드가 최대 두 개의 자식 노드를 가지는 트리 자료 구조를 말한다.

  • 이 두개의 자식 노드는 왼쪽 자식 노드와 오른쪽 자식 노드로 나눌수 있다.

1) 이진 트리의 종류

  • 이진 트리는 자료의 삽입, 삭제 방법에 따라 정 이진 트리(Full binary tree), 포화 이진 트리(Perfect binary tree), 완전 이진 트리(Complete binary tree)로 나뉜다.

1-1. 정 이진 트리(Full binary tree)

  • 각 노드가 0개 혹은 2개의 자식 노드를 갖는다.

1-2. 완전 이진 트리(Complete binary tree)

  • 마지막 레벨을 제외한 모든 노드가 가득 차 있어야 하고, 마지막 레벨의 노드는 전부 차 있지 않아도 되지만 왼쪽이 채워져야 한다.

1-3. 포화 이진 트리(Perfect binary tree)

  • 정 이진 트리이면서 완전 이진 트리인 경우이다. 모든 리프 노드의 레벨이 동일하고, 모든 레벨이 가득 채워져 있는 트리이다.

2) 이진 트리 표현 방법

  • 이진 트리를 표현하는데는 크게 두 가지 방법이 있다.

2-1. 1차원 배열 표현

  • 이진 트리의 i번째 노드를 배열의 i번째 요소에 저장하는 방법이다.
  1. 장점 : 노드의 위치를 색인에 의하여 쉽게 접근할 수 있다.
  2. 단점 : 특정 트리에서 기억 공간의 낭비가 심할 수 있다.

2-2. 연결리스트 표현

  • 왼쪽 자식을 가리키는 포인터 필드와 오른쪽 자식을 가리키는 포인터 필드를 포함하는 노드로 표현하는 방법이다.
  1. 장점 : 기억 장소를 절약할 수 있고, 노드의 삽입과 삭제가 용이하다.
  2. 단점 : 이진 트리가 아닌 일반 트리의 경우에는 각 노드의 차수만큼 가변적인 포인터 필드를 가여쟈 하기 때문에 접근상의 어려움이 따른다.

2. 이진 탐색 트리(Binary Search Tree)


  • 이진 탐색 트리(Binary Search Tree)는 원소가 정렬되어 있다는 특징을 이용해 반씩 쪼개가며 탐색하는 이진 탐색(Binary Search)의 아이디어를 채용한 자료구조이다.

  • 이진 탐색 트리는 모든 왼쪽 자식의 값이 루트나 부모보다 작고, 모든 오른쪽 자식의 값이 루트나 부모보다 큰 값을 가지는 특징이 있다. 즉, 원소가 오름차순으로 정렬되어 있어야 한다.

  • 각 노드에 중복된 키(key)는 없어야 하며, 좌우 서브트리도 모두 이진 탐색 트리여야 한다.

  • 이진 탐색 트리는 균형 잡힌 트리가 아닐 때, 입력되는 값의 순서에 따라 한쪽으로 노드들이 몰리게 될 수 있다. 균형이 잡히지 않은 트리는 탐색하는 데 시간이 더 걸리는 경우도 있기 때문에 이 문제를 해결하기 위해 삽입과 삭제마다 트리의 구조를 재조정하는 과정을 거치는 알고리즘을 추가할 수 있다.

1) 이진 탐색 트리의 탐색 과정

  • 이진 탐색 트리는 기존 이진 트리보다 탐색이 빠르다는 장점이 있다. 이진 탐색 트리의 연산은 트리의 높이가 h(height)라면 o(h)의 복잡도를 가지게 되며, 이와 같은 효율적인 연산이 가능한 이유는 탐색 과정에 있다.

이진 탐색 트리의 탐색 과정

  1. 루트 노드의 키와 찾고자 하는 값을 비교히여 만약 찾고자 하는 값이라면 탐색을 종료한다.
  2. 찾고자 하는 값이 루트 노드의 키보다 작다면 왼쪽 서브 트리로 탐색을 진행한다.
  3. 찾고자 하는 값이 루트 노드의 키보다 크다면 오른쪽 서브 트리로 탐색을 진행한다.
  • 이 과정을 찾고자 하는 값을 찾을 때까지 반복해 진행한다. 만약 값을 찾지 못한다면 그대로 연산을 종료하게 되며, 이러한 탐색 과정을 거치면 최대 트리의 높이(h)만큼 탐색을 진행한다.

2) 특정값 탐색 예시

  • 만약 아래와 같은 트리에서 5라는 값을 찾고자 하면 제일 처음에는 루트 노드와 값을 비교하게 된다. 루트 노드가 여기서는 10이므로 루트 노드보다 작기 때문에, 왼쪽 서브 트리로 탐색을 시작한다.

  • 이후 마주친 노드는 7이고, 찾고자 하는 값은 5이므로 다시 7을 기준으로 왼쪽 서브 트리로 탐색을 진행한다. 이어 만난 값이 찾고자 하는 값이므로 탐색이 종료된다. 10부터 5까지 3번의 탐색이 이뤄졌지만, 만약 3을 찾는다면 4번의 연산이 진행되었을 것이다. 즉 트리 안의 값을 찾는다면 무조건 트리의 높이(h) 이하의 탐색이 이뤄지게 된다.

  • 여기서 트리 안에 찾고자 하는 값이 없더라도 최대 h번의 연산 및 탐색이 진행된다는 것이다. 만일 13이라는 숫자를 찾는다면, 마지막으로 도착하는 노드의 값은 14인데, 여기서 13은 14보다 작으므로 왼쪽 서브 트리로 탐색을 진행해야 하지만 오른쪽 서브 트리가 없으므로 14에서 탐색이 종료 되게 된다. 그렇기 때문에 트리 안에 찾고자 하는 값이 없더라도 최대 h번의 연산 및 탐색이 진행되게 되는 것이다.

post-custom-banner

0개의 댓글