정처기 감자정처기 감자
C언어자료구조

검색

검색어를 입력해 개념, 문제, 필기를 찾습니다.

C언어 이진 트리 (Binary Tree)

코딩C언어
읽는데 10분 소요
처음 쓰인 날: 2026-04-24
마지막 수정일: 2026-04-24
조회수: —
선수학습(3개)
  • C언어 구조체 포인터
  • C언어 재귀함수 (Recursion)
  • C언어 동적 메모리 할당 (malloc, free)

요약

C언어 이진 트리의 노드 구조체 정의와 전위/중위/후위 재귀 순회를 알아봅니다. 자료구조와 재귀를 함께 다루는 정보처리기사 실기 대비 핵심 개념을 정리합니다.

이 페이지는 기출 출제 이력이 없는 보충 페이지입니다
C언어 이진 트리는 현재까지 정처기 실기 기출에 등장한 적이 없는 주제입니다. 핵심 기출 범위만 공부하고 싶다면 이 페이지는 건너뛰어도 됩니다. 최근 회차의 출제 범위가 점점 넓어지고 있어 어디서 나올지 예측하기 어렵기 때문에, 혹시 모를 출제에 대비해 추가한 페이지입니다.

이진 트리 핵심 정리

개념설명예시
이진 트리각 노드가 최대 2개의 자식(left, right)을 가지는 트리부모 → 왼쪽/오른쪽 자식
노드(Node)데이터 + 두 자식 포인터를 가진 구조체int data, Node* left, Node* right
루트(root)트리의 시작 노드 (부모 없음)트리의 가장 위 노드
리프(leaf)자식이 없는 노드left == NULL && right == NULL
전위 순회Root → Left → Right부모를 먼저 방문
중위 순회Left → Root → Right왼쪽부터 차례로
후위 순회Left → Right → Root부모를 마지막에 방문

이진 트리란?

이진 트리 (Binary Tree)는 각 노드가 최대 2개의 자식 노드(왼쪽, 오른쪽)를 가지는 자료구조입니다.

연결 리스트는 한 노드가 다음 노드 하나만 가리키지만, 이진 트리는 두 개의 노드를 가리킵니다. 구조체와 포인터를 함께 사용하므로 두 개념이 익숙하지 않다면 먼저 읽고 돌아오세요.

이진 트리 기본 구조
루트 노드 1을 시작으로 각 노드가 최대 2개의 자식(left, right)을 가지는 이진 트리. 자식이 없는 노드(4, 5, 6)는 리프 노드입니다.
용어의미그림 예시
루트(root)트리의 가장 위 노드1
부모(parent)자식을 가진 노드2는 4, 5의 부모
자식(child)부모 아래 노드4, 5는 2의 자식
리프(leaf)자식이 없는 노드4, 5, 6

노드 구조체 정의

이진 트리의 노드는 데이터 + 왼쪽 자식 포인터 + 오른쪽 자식 포인터 3개의 멤버를 가집니다.

c
코드 하이라이팅 중…

struct Node* left와 struct Node* right는 자기 자신과 같은 타입(struct Node)을 가리키는 포인터입니다. 이렇게 자기 자신과 같은 타입의 포인터를 멤버로 가지는 것을 자기참조 구조체라고 합니다.

노드 구조체 메모리 박스
노드 한 개는 데이터 한 칸(int data)과 왼쪽·오른쪽 자식의 주소 두 칸(struct Node* left, struct Node* right)으로 구성됩니다.

노드 만들기 (정적 선언)

가장 단순한 방법은 노드를 변수로 선언하고 직접 연결하는 것입니다. 위 그림(루트 1, 자식 2/3, 2의 자식 4/5, 3의 오른쪽 자식 6)을 코드로 만들면 다음과 같습니다.

c
코드 하이라이팅 중…

구조체 초기화(중괄호 {...}로 멤버 값을 한 번에 채우는 것) 순서는 멤버 선언 순서(data, left, right)와 일치해야 합니다. 자식이 없으면 NULL을 넣어 "여기 아래로 더 이상 자식 노드가 없다"는 표시를 합니다.

정적 선언 노드들의 메모리 배치와 연결
각 노드 변수(n1~n6)가 메모리에 따로 존재하고, left/right에 다른 노드의 주소(예: &n4 = 주소400)를 저장하여 트리로 연결됩니다.
자식이 없으면 반드시 NULL로 초기화하세요
left나 right를 초기화하지 않으면 쓰레기 값이 들어가 순회 함수가 잘못된 주소를 따라가다 프로그램이 비정상 종료됩니다. 리프 노드는 left, right 모두 NULL로 명시하세요.

노드 만들기 (동적 할당)

정적 선언은 개념 이해용으로 살펴봤고, 이제부터는 실기에서 자주 쓰는 동적 할당 방식을 배웁니다. 두 방식 모두 위와 똑같은 트리를 만들며, 실기에서는 동적 할당이 표준입니다. malloc으로 동적 할당해 노드를 만드는 패턴을 숙지해 두세요.

c
코드 하이라이팅 중…

malloc은 노드 크기만큼 메모리를 할당하고 그 시작 주소를 반환합니다. 반환값을 struct Node*로 형변환한 뒤 멤버를 초기화합니다.

c
코드 하이라이팅 중…

위 정적 선언과 똑같은 트리(루트 1, 자식 2/3, 2의 자식 4/5, 3의 오른쪽 자식 6)가 만들어집니다.

화살표 연산자 ->는 포인터가 가리키는 구조체의 멤버에 접근합니다. root->left->left는 "root의 왼쪽 자식의 왼쪽 자식"을 의미합니다.

malloc으로 동적 할당된 노드들의 메모리 배치
createNode를 호출할 때마다 malloc이 새 노드를 메모리에 만들고 그 주소를 반환합니다. root 변수는 첫 번째 노드(data=1)의 주소를 가리킵니다.

트리 순회

순회(Traversal)는 트리의 모든 노드를 한 번씩 방문하는 것입니다. 여기서 "방문"이란 그 노드의 데이터를 출력하거나 처리하는 것을 말합니다. 이진 트리에서는 부모와 두 자식의 방문 순서에 따라 전위·중위·후위 3가지 순회가 있습니다.

순회방문 순서영문
전위 순회Root → Left → Rightpreorder
중위 순회Left → Root → Rightinorder
후위 순회Left → Right → Rootpostorder

각 순회는 재귀함수로 구현하며, 기저 조건(재귀를 멈추는 종료 지점)은 root == NULL 입니다. 리프 노드의 left나 right(NULL)를 따라간 직후 preorder(NULL)이 호출되는 순간 즉시 return합니다.

전위 순회 (preorder)

부모(Root)를 먼저 방문하고, 왼쪽 자식, 오른쪽 자식 순서로 재귀 호출합니다.

c
코드 하이라이팅 중…

위 트리(루트=1)에서 preorder(root)를 호출하면 다음 순서로 노드를 방문합니다.

text
코드 하이라이팅 중…
전위 순회 방문 순서
루트 1부터 시작해 부모 → 왼쪽 → 오른쪽 순으로 내려가며 방문합니다. 번호는 출력 순서입니다.

중위 순회 (inorder)

왼쪽 자식을 먼저 끝까지 방문한 뒤 부모를 방문하고, 마지막으로 오른쪽 자식을 방문합니다.

c
코드 하이라이팅 중…

같은 트리에서 inorder(root) 호출 결과는 다음과 같습니다.

text
코드 하이라이팅 중…
중위 순회 방문 순서
가장 왼쪽 노드(4)부터 시작해 왼쪽 → 부모 → 오른쪽 순으로 방문합니다. 번호는 출력 순서입니다.

후위 순회 (postorder)

왼쪽 자식과 오른쪽 자식을 모두 방문한 뒤 부모를 마지막으로 방문합니다.

c
코드 하이라이팅 중…

같은 트리에서 postorder(root) 호출 결과는 다음과 같습니다.

text
코드 하이라이팅 중…
후위 순회 방문 순서
자식들을 모두 방문한 뒤 부모를 마지막에 방문합니다. 루트 1이 가장 마지막에 출력됩니다. 번호는 출력 순서입니다.
순회 이름과 `printf` 위치를 짝지어 외우세요
`printf`(부모 출력)가 재귀 호출보다 앞에 있으면 전위, 가운데에 있으면 중위, 뒤에 있으면 후위입니다. 함수 이름이 다르더라도 코드의 출력 위치만 보고 어떤 순회인지 판단할 수 있습니다.

재귀 호출 추적하기

순회 결과만 외우지 말고, 재귀 호출이 어떻게 펼쳐지는지 직접 따라가 봅시다. 전위 순회를 예로 듭니다.

c
코드 하이라이팅 중…

함수 호출이 기저 조건(NULL)에 도달할 때까지 펼쳐집니다. 기저 조건에 도달하면 자기를 호출한 함수로 돌아가 다음 줄을 실행합니다.

text
코드 하이라이팅 중…

들여쓰기 트리를 위에서 아래로 읽으면 함수가 실제로 실행되는 시간 순서와 같습니다(재귀가 깊이 우선으로 펼쳐지기 때문입니다). 들여쓰기 1칸은 함수 호출 1단계 깊이를 나타냅니다. 각 호출에서 printf가 실행되는 시점을 위에서 아래로 읽으면 출력 순서가 그대로 나옵니다: 1 2 4 5 3 6.

전위 순회 재귀 호출 추적
재귀 호출이 깊이 우선으로 펼쳐지다가 기저(NULL)에 도달하면 위로 복귀합니다. 들여쓰기 1칸이 호출 깊이 1단계이며, 각 단계에서 printf가 누적되어 최종 출력 1 2 4 5 3 6이 됩니다.
순회 문제 풀이 순서
1) 코드를 보고 전위/중위/후위 중 무엇인지 확인합니다. 2) 트리 그림에서 루트부터 재귀 호출을 따라가며 출력 순서를 받아 적습니다. 3) NULL 자식을 만나면 즉시 복귀하여 다음 형제로 이동합니다.

순회별 출력 비교

같은 트리를 세 가지 순회로 출력한 결과를 비교하면 차이가 한눈에 보입니다.

순회출력 순서첫 출력마지막 출력
전위(preorder)1 2 4 5 3 6루트(1)가장 오른쪽 리프(6)
중위(inorder)4 2 5 1 3 6가장 왼쪽 리프(4)가장 오른쪽 리프(6)
후위(postorder)4 5 2 6 3 1가장 왼쪽 리프(4)루트(1)

정보처리기사 실기 대비 문제

문제를 불러오는 중이에요.
문제를 불러오는 중이에요.
메가커피와 함께, 홈페이지 개선에 참여하세요! ☕
혹시 이용에 불편한 점이나 개선이 필요한 부분을 발견하셨나요? 댓글로 알려주시면 더 나은 감자가 될 수 있어요! 🥔 제보해주신 모든 분께 메가커피 기프티콘을 드립니다! (본인 이메일로 댓글 달아주셔야해요~)

관련 글

(41개)
제목태그업데이트시험
C언어 형변환 (Casting)
C언어코딩C언어
2026-05-15-
C언어 연결 리스트 뒤집기 (Reverse Linked List)
C언어코딩C언어
2026-05-06-
C언어 사용자 정의 함수 기초
C언어코딩C언어
2026-05-06-
C언어41개
제목태그업데이트시험
C언어 형변환 (Casting)
C언어코딩C언어
2026-05-15-
C언어 연결 리스트 뒤집기 (Reverse Linked List)
C언어코딩C언어
2026-05-06-
C언어 사용자 정의 함수 기초
C언어코딩C언어
2026-05-06-
C언어 sizeof 연산자
C언어코딩C언어
2026-05-06-
C언어 중첩 구조체와 포인터 접근
C언어코딩C언어
2026-04-24-
C언어 함수 포인터 (Function Pointer)
C언어코딩C언어
2026-04-24-
배열 C언어 코딩 감자시험
감자시험C언어배열감자시험
2026-03-28응시
C언어 왕감자 정보처리기사 실기 모의 시험
C언어C언어
2026-03-27응시
제어문/반복문 C언어 코딩 감자시험
감자시험C언어제어문반복문
2026-03-28응시
연산자 C언어 코딩 감자시험
감자시험C언어연산자감자시험
2026-03-28응시
포인터 C언어 코딩 감자시험
감자시험C언어포인터감자시험
2026-03-28응시
문자열 C언어 코딩 감자시험
감자시험C언어문자열감자시험
2026-03-28응시
구조체 C언어 코딩 감자시험
감자시험C언어구조체감자시험
2026-03-28응시
C언어 구조체 배열
C언어코딩C언어
2026-03-21-
C언어 구조체 포인터
C언어코딩C언어
2026-04-24-
C언어 함수 프로토타입
C언어코딩C언어
2026-03-21-
C언어 입력 함수 - scanf, getchar, gets
C언어코딩C언어
2026-03-21-
C언어 출력 함수 - putchar, printf, puts
C언어코딩C언어
2026-09-29-
C언어 문자열 포인터 (char *)
C언어코딩C언어
2026-03-21-
C언어 포인터 산술 (Pointer Arithmetic)
C언어코딩C언어
2026-03-21-
C언어 재귀함수 (Recursion)
C언어코딩C언어
2026-03-21-
C언어 선택정렬 (Selection Sort)
C언어코딩C언어
2026-02-10-
C언어 스택 (Stack) - LIFO 자료구조
C언어코딩C언어
2026-03-21-
C언어 2차원 배열
C언어코딩C언어
2026-03-21-
C언어 원형 큐 (Circular Queue)
C언어코딩C언어
2026-03-21-
C언어 ctype.h 문자 판별 함수
C언어코딩C언어
2026-03-21-
C언어 자료형
C언어코딩C언어
2026-05-15-
C언어 이중 포인터 (Double Pointer)
C언어코딩C언어
2026-03-21-
C언어 동적 메모리 할당 (malloc, free)
C언어코딩C언어
2026-05-04-
C언어 헤더 파일과 #include
C언어코딩C언어
2026-03-21-
C언어 연결 리스트 (Linked List)
C언어코딩C언어
2026-05-06-
C언어 포인터 배열과 2차원 배열
C언어코딩C언어
2026-03-24-
C언어 포인터의 기초
C언어코딩C언어
2026-06-25-
C언어 큐 (Queue) - FIFO 자료구조
C언어코딩C언어
2026-03-21-
C언어 static 변수 - 값이 유지되는 변수
C언어코딩C언어
2026-03-21-
C언어 포인터를 이용한 문자열 복사
C언어코딩C언어
2026-07-09-
C언어 문자열 뒤집기 (포인터 활용)
C언어코딩C언어
2026-03-21-
C언어 구조체
C언어코딩C언어
2026-03-20-
C언어 삼항 연산자
C언어코딩C언어
2026-03-21-
C언어 typedef - 자료형에 새 이름 붙이기
C언어코딩C언어
2026-03-21-
전설의 완전수 문제 - C언어
C언어코딩C언어
2025-09-12-
정처기 감자정처기 감자

정보처리기사 합격
도와줄라고 하는 감자

실기 이론

  • 이론 공부법
  • DB
  • 네트워크/OS
  • SW 설계
  • SW 개발
  • 보안/신기술

시험 응시

  • 시험장 찾기
  • 원서 접수
  • 응시자격 서류

요약 PDF

  • 26년 3회 이론 압축
  • 26년 3회 코딩 압축
  • 초압축 25년 3회
  • 압축 25년 3회

기출문제

  • 전체 기출문제
  • 25년 3회
  • 25년 2회
  • 문제 포럼

감자 이용권

  • 이용권 구매

실기 이론

  • 이론 공부법
  • DB
  • 네트워크/OS
  • SW 설계
  • SW 개발
  • 보안/신기술

시험 응시

  • 시험장 찾기
  • 원서 접수
  • 응시자격 서류

요약 PDF

  • 26년 3회 이론 압축
  • 26년 3회 코딩 압축
  • 초압축 25년 3회
  • 압축 25년 3회

기출문제

  • 전체 기출문제
  • 25년 3회
  • 25년 2회
  • 문제 포럼

감자 이용권

  • 이용권 구매
© 2025 재현기획개발. All rights reserved.
  • 정처기 감자의 시작
  • 업데이트 로그
  • 개인정보 처리방침
  • 이용약관
상호명 : 재현기획개발 / 주소: 서울특별시 영등포구 영등포로 150, 지하1층 108호 L145 가라지(당산동1가, 생각공장 당산) / 대표: 김재현 / 전화: 010-8158-7127 / 통신판매업신고: 제2025-서울영등포-1569호 / 이메일: contact@edugamja.com / 사업자등록번호: 573-51-00999