[자료구조] Binary-Tree 이진 트리 C언어로 구현하기

2024. 4. 6. 01:23·CS/자료구조
목차
  1. 이진트리?
  2. 이진트리 종류
  3. 이진 트리 C언어로 구현하기

이진트리?


자식 노드의 수가 2개 이하인 트리 (left child, right child)

 

이진트리 종류

  • Full binary tree: 모든 노드의 자식 노드 수가 0개 혹은 2개
  • Complete tree: 마지막 레벨을 제외한 트리의 모든 레벨에서 노드가 가득 채워져 있고, 마지막 레벨의 노드는 왼쪽부터 채움
  • Balanced binary tree: 트리의 왼쪽 서브트리와 오른쪽 서브트리 사이의 레벨 차이가 1 이하인 트리
  • perfect binary tree: 트리의 모든 노드가 2개의 자손을 지님, 트리의 모든 leaf는 같은 레벨에 있음

 

이진 트리 C언어로 구현하기


트리의 노드 구조체

#include <stdio.h>
#include <stdlib.h>

typedef struct tNode {
    int data;
    struct tNode* left;
    struct tNode* right;
} tNode;

더블 링크드 리스트의 형태와 유사하다.

하나는 왼쪽 자식 노드를, 나머지 하나는 오른쪽 자식 노드를 가리킨다.

 

complete binary tree의 경우 다음과 같이 배열로 표현할 수 있다.

 

트리 순회 Traversal 함수 구현하기

 

1. 데이터를 담은 새로운 노드

// data를 담는 새로운 노드 선언
tNode* newNode(int data) {
    tNode* node = (tNode*)malloc(sizeof(tNode));
    node->data = data;
    node->left = NULL;
    node->right = NULL;
    
    return node;
}

 

 

2-1. In-order 순회 함수 구현

// in-order로 순회하는 함수 구현
void printInorder(tNode* node) {
	
    if (node == NULL)
        return;

    // 왼쪽 서브트리 재귀적 순회
    printInorder(node->left);

    // 서브트리의 root를 출력
    printf("%d ", node->data);

    // 오른쪽 서브트리 재귀적 순회
    printInorder(node->right);
}

 

2-2. pre-order 순회 함수 구현

// pre-order로 순회하는 함수 구현
void printPreorder(tNode* node) {
	
    if (node == NULL)
        return;

    // 트리의 root를 출력
    printf("%d ", node->data);

    // 왼쪽 서브트리 재귀적 순회
    printPreorder(node->left);

    // 오른쪽 서브트리 재귀적 순회
    printPreorder(node->right);
}

 

2-3. post-order 순회 함수 구현

// post-order로 순회하는 함수 구현
void printPostorder(tNode* node) {
	
    if (node == NULL)
        return;
    
    // 왼쪽 서브트리 재귀적 순회
    printPostorder(node->left);

    // 오른쪽 서브트리 재귀적 순회
    printPostorder(node->right);

    // (서브)트리의 root를 출력
    printf("%d ", node->data);
}

 

3. 트리 만들고(1번의 newNode 함수를 이용) 순회하기(2번의 함수들 이용)

int main() {
	
    tNode* root = newNode(1);
    root->left = newNode(2);
    root->right = newNode(3);
    root->left->left = newNode(4);
    root->left->right = newNode(5);
    root->right->left = newNode(6);
    root->right->right = newNode(7);

    printf("In-order 순회\n");
    printInorder(root);
    printf("\n");

    printf("Pre-order 순회\n");
    printPreorder(root);
    printf("\n");

    printf("Post-order 순회\n");
    printPostorder(root);
    printf("\n");

    getchar();
    return 0;
}

결과

'CS > 자료구조' 카테고리의 다른 글

[자료구조] 배열과 동적 메모리 할당 in C언어  (0) 2024.04.13
[자료구조] Binary Search Tree (BST) C언어로 구현하기 (검색, 삽입, 삭제)  (0) 2024.04.09
[자료구조] Doubly Linked List (이중 연결 리스트) C언어로 구현하기  (0) 2024.03.31
[자료구조] Linked List (연결 리스트) C언어로 구현하기 (노드 순회, 검색, 삽입, 삭제)  (0) 2024.03.31
[자료구조] Queue(큐) C언어로 구현하기 - 2 (원형 큐)  (0) 2024.03.31
  1. 이진트리?
  2. 이진트리 종류
  3. 이진 트리 C언어로 구현하기
'CS/자료구조' 카테고리의 다른 글
  • [자료구조] 배열과 동적 메모리 할당 in C언어
  • [자료구조] Binary Search Tree (BST) C언어로 구현하기 (검색, 삽입, 삭제)
  • [자료구조] Doubly Linked List (이중 연결 리스트) C언어로 구현하기
  • [자료구조] Linked List (연결 리스트) C언어로 구현하기 (노드 순회, 검색, 삽입, 삭제)
1in
1in
1in
Love IT!
1in
전체
오늘
어제
  • 분류 전체보기 (52)
    • BackEnd (9)
      • Django (3)
      • AWS (0)
      • Error (2)
    • 문제 풀이 (7)
      • Baekjoon (7)
    • CS (36)
      • 자료구조 (17)
      • Java (11)
      • C언어 (1)
      • 알고리즘 (6)
      • 어셈블리어 (0)
      • Python (1)
    • 이것저것 (0)
      • 회고 (0)
      • 책 (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • avl tree
  • 레드블랙트리
  • 모듈
  • 링크드리스트
  • 큐
  • 재귀 분석
  • 유클리드 호제법
  • 재귀
  • 알고리즘
  • 하향식 분석
  • 라이브러리
  • 상향식 분석
  • C언어
  • 이진트리
  • 자료구조
  • 연결리스트
  • 이중연결리스트
  • 자바
  • 인터페이스
  • Queue

최근 댓글

최근 글

hELLO· Designed By정상우.v4.5.2
1in
[자료구조] Binary-Tree 이진 트리 C언어로 구현하기
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.