트리 구조는 노드들의 집합으로 이루어지며 각 노드는 하나의 부모 노드
와 여러 개의 자식 노드
를 가질 수 있다. 트리는 여러 형태로 존재할 수 있지만 가장 일반적인 형태는 이진 트리
로 각 노드가 최대 두 개의 자식을 가진다.
계층적 구조: 트리의 최상위에 위치한 노드를 루트(root)라고 부르며 루트 노드에서부터 각 자식 노드로 연결되는 구조를 가진다.
연결 구조: 노드들이 부모-자식
관계로 연결되어 있으며 각 노드는 다른 노드와 연결되는 에지(edge)
를 가진다.
순환 없음: 트리는 순환이 없는 비순환 그래프의 한 종류로 노드들 사이에 반복적으로 연결되는 경로가 존재하지 않는다.
자식-부모 관계: 각 노드는 자식을 가질 수 있으며 이를 통해 데이터를 계층적으로 분류할 수 있다.
계층적 데이터 표현: 트리는 데이터 간의 계층 구조를 표현하기에 적합하다.
효율적인 검색 및 정렬: 틀히 이진 탐색 트리
는 데이터를 정렬된 형태로 저장할 수 있어 삽입, 삭제, 탐색 등의 연산을 효육적으로 수행할 수 있다.
이진 탐색 트리
1. 해당 노드의 왼쪽에 있는 모든 자식 노드의 값은 해당 노드의 값보다 작다.
2. 해당 노드의 오른쪽에 있는 모든 자식 노드의 값은 해당 노드의 값보다 크다.
예시)
8
/ \
3 10
/ \ \
1 6 14
/ \ /
4 7 13
힙(heap)
트리는 우선순위 큐 구현에 사용된다.Root -> Left -> Right
Root를 가장 먼저 방문하기에 Preorder(전위)라고 칭한다.
# python 코드
def preorder(node):
if node:
print(node.value) # 현재 노드를 방문
preorder(node.left) # 왼쪽 서브트리 방문
preorder(node.right) # 오른쪽 서브트리 방문
1
/ \
2 3
/ \
4 5
루트에서 시작한다.
1
을 방문한다. (방문 순서에 1
추가)왼쪽 자식 노드로 이동한다. (Left(2)
로 이동)
2
를 방문한다. (방문 순서에 2
추가)다시 왼쪽 자식 노드로 이동한다. (Left(4)
로 이동)
4
를 방문한다. (방문 순서에 4
추가)4
는 왼쪽과 오른쪽 자식이 없으므로 이전 노드로 돌아간다. (2
로 돌아감)2
로 돌아와서, 2
의 오른쪽 자식 노드로 이동한다. (Right(5)
로 이동)
5
를 방문한다. (방문 순서에 5
추가)5
는 왼쪽과 오른쪽 자식이 없으므로, 이전 노드 1
로 돌아간다.1
로 돌아와서, 1
의 오른쪽 자식 노드로 이동한다. (Right(3)
로 이동)
3
을 방문한다. (방문 순서에 3
추가)3
은 왼쪽과 오른쪽 자식이 없으므로 순회가 종료된다.최종 방문 순서: 1 → 2 → 4 → 5 → 3
트리 구조 복제 및 저장 : 트리를 파일로 저장하고 나중에 다시 복원할 때 전위 순회는 트리의 구조를 일관성있게 기록하기에 적합하다.(후위 순회도 적합하다)
수식 표현 트리: 수학적인 표현을 트리 구조로 나타낼 때 전위 표기법으로 표현된 수식을 파싱하고 평가하는 과정에서 유용하다.
트리 기반 알고리즘 구현: 파일 시스템 탐색 등에서 루트부터 탐색을 시작해야 하는 경우 전위 순회가 사용된다.
Left -> Root -> Right
Root를 두번째(중간)에 방문하기에 Inorder라고 칭한다.
# python 코드
def inorder(node):
if node:
inorder(node.left) # 왼쪽 서브트리 방문
print(node.value) # 현재 노드를 방문
inorder(node.right) # 오른쪽 서브트리 방문
1
/ \
2 3
/ \
4 5
루트에서 시작한다.
1
에서 왼쪽 자식 노드 2
로 이동한다. (Left(2)
로 이동)왼쪽 자식 노드 2
로 이동한다.
2
에서 다시 왼쪽 자식 노드 4
로 이동한다. (Left(4)
로 이동)현재 노드 4
를 방문한다. (방문 순서에 4 추가)
4
는 왼쪽과 오른쪽 자식이 없으므로 본인 방문 후 이전 노드 2
로 돌아간다.2로 돌아온다.
2
를 방문한다. (방문 순서에 2
추가)5
로 이동한다. (Right(5)
로 이동)현재 노드 5
를 방문한다. (방문 순서에 5
추가)
5
는 왼쪽과 오른쪽 자식이 없으므로 이전 노드 1
로 돌아간다.1로 돌아온다.
1
을 방문한다. (방문 순서에 1
추가)3
으로 이동한다. (Right(3)로 이동)현재 노드 3을 방문한다. (방문 순서에 3 추가)
최종 방문 순서: 4 → 2 → 5 → 1 → 3
이진 탐색 트리의 정렬: 중위 순회는 이진 탐색 트리에서 노드들을 정렬하여 출력할 때 사용된다. 트리에서 데이터를 순서대로 나열할 수 있다는 장점이 있다.
수식의 변환 : 수학적인 표현을 트리 구조로 나타낼 때 중위 표기법으로 표현된 수식을 파싱하고 평가하는 과정에서 유용하다.
Left -> Right -> Root
Root를 마지막에 방문하기에 Postorder라고 칭한다.
# python 코드
def inorder(node):
if node:
inorder(node.left) # 왼쪽 서브트리 방문
print(node.value) # 현재 노드를 방문
inorder(node.right) # 오른쪽 서브트리 방문
1
/ \
2 3
/ \
4 5
루트에서 시작한다.
1
에서 왼쪽 자식 노드 2
로 이동한다. (Left(2)로 이동)왼쪽 자식 노드 2로 이동한다.
2
에서 다시 왼쪽 자식 노드로 이동한다. (Left(4)
로 이동)현재 노드 4
를 방문한다. (방문 순서에 4
추가)
4
는 왼쪽과 오른쪽 자식이 없으므로 이전 노드 2
로 돌아간다.2
로 돌아온다.
5
로 이동한다. (Right(5)
로 이동)현재 노드 5
를 방문한다. (방문 순서에 5
추가)
5
는 왼쪽과 오른쪽 자식이 없으므로 이전 노드 2
로 돌아간다.2로 돌아온다.
2
를 방문한다. (방문 순서에 2
추가)1
로 돌아간다.1로 돌아온다.
3
으로 이동한다. (Right(3)
로 이동)현재 노드 3
을 방문한다. (방문 순서에 3
추가)
3
은 왼쪽과 오른쪽 자식이 없으므로 이전 노드 1
로 돌아간다.1
로 돌아온다.
1
을 방문한다. (방문 순서에 1
추가)최종 방문 순서: 4 → 5 → 2 → 3 → 1
노드 삭제: 이진 트리에서 모든 노드를 삭제하려면 자식 노드부터 삭제해야 하는데 이때 후위 순회를 사용하면 트리의 구조를 유지하면서 안전하게 모든 노드를 삭제할 수 있다.
디렉토리 및 파일 삭제: 위의 노드 삭제와 유사하게 파일 시스템과 같은 계층적 구조에서 디렉토리나 폴더를 삭제할 때는 하위 파일과 폴더를 먼저 삭제해야 한다.
수식의 계산: 수학적인 표현을 트리 구조로 나타낼 때 후위 표기법으로 표현된 수식을 파싱하고 평가하는 과정에서 유용하다.
1
/ \
2 3
/ \
4 5
/ \
6 7