| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| 9 | 10 | 11 | 12 | 13 | 14 | 15 |
| 16 | 17 | 18 | 19 | 20 | 21 | 22 |
| 23 | 24 | 25 | 26 | 27 | 28 | 29 |
| 30 | 31 |
- Class
- Stack
- Kotlin LinkedList
- kotlin
- 우송대학교
- PICO4
- 컴포즈
- 스택
- 라즈베리파이 피코
- List
- 자료구조
- Android
- 우송대
- Kotlin자료구조
- 재정의함수
- 클래스
- 추상화함수
- Queue
- 상태 호이스팅
- 리컴포지션
- LinkedList
- 아두이노
- 큐
- 개발 보드
- Compoae
- State Hoisting
- 코틀린
- kotlinClass
- deque
- 안드로이드
- Today
- Total
개발자의 생활
[ C언어 ] 자료구조_트리(Link) 본문
1. 트리 자료구조란
트리 자료구조는 이름대로 나뭇가지를 모방하여 자료들을 구조화한 것입니다.
이전까지 했던 array, linkedlist, stack, queue, deque 자료구조 들은 선형으로 이루어진 자료구조였지만 이번 Tree 자료구조는 비선형 자료구조입니다.
![]() |
![]() |
트리구조는 크게 부모 노드와 자식 노드로 분류할 수 있습니다.
위 트리에서는 A가 부모 노드이고 왼쪽에 연결되어 있는(B) 노드와 오른쪽에 연결되어 있는(C) 노드는 A의 자식노드입니다.
그리고 (B) 노드 입장에서는 (D)와 (E) 노드가 자식노드이고 (B) 노드가 부모노드입니다.
가족관계도 와 동일한 구조라고 보시면 됩니다.
2. 트리 구성과 용어

트리구조의 명칭을 알아보겠습니다.
루트노드: 이는 트리에서 가장 상위에 위치해 있는 단 하나의 노드를 의미합니다. 위 그림에서는 A노드가 루트노드입니다.
부모노드: 자식노드 입장에서 한 단계 위에 있는 노드를 의미합니다.
자식노드: 부모 노드의 하위에 있는 노드를 의미합니다.
후손노드: 이는 자식노드에서 확장된 의미로 특정 노드의 하위에 있는 모든 노드를 의미합니다.
형제노드: 이는 같은 레벨에 위치한 노드를 의미합니다. 레벨 2에 위치해 있는 B와 C는 형제노드입니다.
단말노드: 이는 자식 노드가 하나도 없는 노드입니다. 위 트리에서는 E, F, G, H, I 가 단말 노드입니다.
차수: 이는 자식노드의 개수를 의미합니다. 위 트리에서 C 노드의 자식노드는 F, G, H 3개 이기 때문에 차수는 3입니다.
3. 일반트리, 이진트리
일반트리는 자식노드의 개수가 정해지지 않기 때문에 무한하게 구성할 수 있습니다. 이는 장점으로 볼 수 있지만 단점은 프로그램을 만들 때 복잡해질 수 있습니다.
그래서 효율적이고 쉽게 제어할 수 있는 형태의 이진트리가 만들어졌습니다. 이는 자식 노드를 최대 2개로 제한하여 구성하도록 만든 트리입니다.
일반트리는 주로 파일시스템 조직도 등 현실과 관련된 구조를 만들 때 주로 사용되고
이진트리는 탐색 연산 등을 수행할 때 많이 사용됩니다.
상황에 따라 일반트리 와 이진트리를 선택해서 사용해야 하지만 이 블로그에서는 구현하기 쉽고 편한 이진트리 만 다루겠습니다.
4. 이진트리의 종류와 특징
이진트리에는 특수한 규칙이 있습니다.
| 포화 | 완전 | 기타 |
![]() |
![]() |
![]() |
이진트리는 위와 같이 3가지로 분류할 수 있습니다.
그전에 한 가지 규칙을 설명드리겠습니다.
이진트리의 각 노드에는 레벨 순서대로 왼쪽에서 오른쪽으로 순서대로 번호를 붙일 수 있습니다. 위 트리에서 알파벳은 노드번호의 순서대로 부여한 것입니다.
포화 이진트리: 각 레벨에 노드가 모두 차있는 트리입니다.
완전 이진트리: 모든 노드가 레벨 순서 그리고 왼쪽부터 오른쪽으로 순서대로 있어야 합니다. 중간에 노드가 하나라도 비어있으면 성립이 안됩니다.
기타 이진트리: 이진트리의 조건만 만족하면 됩니다.
5. 이진트리 구현방법

이진트리의 구조는 간단합니다. 데이터 변수와 양쪽 자식노드의 주소를 담을 포인터 변수를 가질 수 있는 노드를 만들고 노드끼리 연결을 시키면 됩니다. 이중 연결 리스트의 노드와 동일한 구조이지만 노드를 연결하는 방식이 다를 뿐입니다.
typedef struct Tree {
element data;
struct Tree* left;
struct Tree* right;
}Tree;
이를 구조체로 이렇게 만들면 됩니다.
int main() {
Tree node7 = { 7, NULL, NULL };
Tree node6 = { 6, NULL, NULL };
Tree node5 = { 5, NULL, NULL };
Tree node4 = { 4, NULL, NULL };
Tree node3 = { 3, &node6, &node7 };
Tree node2 = { 2, &node4, &node5 };
Tree node1 = { 1, &node2, &node3 };
return 0;
}
그리고 이렇게 연결을 하면 트리구조가 만들어집니다.
지금까지 트리 자료구조에 대해 알아보았습니다.
다음에는 이진트리의 순회방법을 포스팅하겠습니다. 감사합니다.
'자료구조 > C언어' 카테고리의 다른 글
| [ C언어 ] 자료구조_트리순회 (0) | 2025.11.04 |
|---|---|
| [ C언어 ] 자료구조_덱(배열_Array) (0) | 2025.10.16 |
| [ C언어 ] 자료구조_덱(연결 리스트_LinkedList) (0) | 2025.10.16 |
| [ C언어 ] 자료구조_큐(연결 리스트_LinkedList) (0) | 2025.10.09 |
| [ C언어 ] 자료구조_큐(Array) (0) | 2025.10.08 |




