[자료구조] Binary Search Tree (BST) C언어로 구현하기 (검색, 삽입, 삭제)

2024. 4. 9. 03:30·CS/자료구조
목차
  1. Binary Search Tree?
  2. 장점
  3. C언어로 구현하기(Search, Insert, Delete)
  4. 1. Search
  5. 2. Insert
  6. 3. delete

Binary Search Tree?

왼쪽의 모든 노드보다는 크고, 오른쪽의 모든 노드보다는 작은 이진 트리

장점

  • search 시에 key를 찾기가 쉬움
  • 삽입/삭제가 쉬움

 

C언어로 구현하기(Search, Insert, Delete)


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

// bst 구조체 선언
typedef struct BstNode {
    int key;
    struct BstNode *left, *right;
} BstNode;

 

 

1. Search

1. 최솟값 Search

// bst에서 최솟값 찾기
BstNode* findMin(BstNode* root) {
    if (root == NULL)
        return NULL;
    else if (root->left != NULL)
        return findMin(root->left);
    return root;
}

 

2. 최댓값 Search

BstNode* findMax(BstNode* root) {
    if (root == NULL)
        return NULL;
    else if (root->right != NULL)
        return findMax(root->right);
    return root;
}

 

3. 원하는 key값 Search

// bst에서 key 찾기
BstNode* searchNode(BstNode* root, int target) {
    if (root == NULL)
        return NULL;
    if (root->key > target)
        return searchNode(root->left, target);
    else if (root->key < target)
        return searchNode(root->right, target);
    else
        return root;
}

 

 

 

2. Insert

// key를 삽입
BstNode* insertNode(BstNode* node, int value) {
    
    // 트리가 비어있으면 새로운 노드를 만듦
    if (node == NULL) {
        // 해당 위치까지 이동 했으니 그 곳에서 노드를 만듦
        BstNode* tmp = (BstNode*)malloc(sizeof(BstNode));
        tmp->key = value;
        tmp->left = tmp->right = NULL;
        return tmp;
    }

    // Search 과정과 비슷함
    if (value < node->key)
        node->left = insertNode(node->left, value);
    else if (value > node->key)
        node->right = insertNode(node->right, value);
    else    // 이미 key가 트리 안에 있으면
        ;   // 아무 것도 하지 않음
    
    return node;
}

트리가 비어있는 경우는 처음부터 트리가 비어있었거나, 위치를 찾은 경우에 해당함

그 위치에서 tmp를 이용하여 노드를 만든다.

이후 재귀적 과정을 통해 노드가 연결 된다.

 

 

3. delete

// x값을 delete 과정
BstNode* deleteNode(BstNode* root, int x) {

    if (root == NULL)
        return NULL;

    if (x > root->key)
        root->right = delete(root->right);
    else if (x < root->key)
        root->left = delete(root->left);

    else {
        // x 노드에 자식이 0개일 경우
        if (root->left == NULL && root->right == NULL) {
            free(root);
            return NULL;
        }

        // x 노드에 자식이 1개일 경우
        else if (root->left == NULL && root->right == NULL) {
            // tmp 선언하여 x 노드의 자식 노드를 저장함
            BstNode* tmp;
            // 오른쪽에 자식이 있는 경우
            if (root->left == NULL)
                tmp = root->right;
            // 왼쪽에 자식이 있는 경우
            else 
                tmp = root->left;
            // x 노드 삭제
            free(root);
            return tmp;
        }

        // x 노드에 자식이 2개일 경우
        else {
            // x 노드의 오른쪽 서브트리의 최솟값을 찾아서 tmp에 저장함
            BstNode* tmp = findMin(root->right);
            // root의 값을 tmp 값으로 변경
            root->key = tmp->key;
            // 그 최솟값 노드를 삭제함
            root->right = delete(root->right, tmp->key);
        }
    }
    return root;
}

삭제하고자 하는 노드의 자식 수에 따라 해결방법이 달라지므로 주의해야한다.

자식이 0개인 경우: 그냥 그 노드를 삭제하면 됨

자식이 1개인 경우: 그 노드의 자식 노드를 그 노드의 이전 노드와 이어야 함

자식이 2개인 경우: 그 노드의 오른쪽 서브트리의 최솟값을 그 노드의 값에 저장하고, 기존의 최솟값 노드는 제거하는 과정을 거쳐야 한다.

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

[자료구조] AVL Tree C언어로 구현하기 (Insertion, Delete)  (0) 2024.04.18
[자료구조] 배열과 동적 메모리 할당 in C언어  (0) 2024.04.13
[자료구조] Binary-Tree 이진 트리 C언어로 구현하기  (0) 2024.04.06
[자료구조] Doubly Linked List (이중 연결 리스트) C언어로 구현하기  (0) 2024.03.31
[자료구조] Linked List (연결 리스트) C언어로 구현하기 (노드 순회, 검색, 삽입, 삭제)  (0) 2024.03.31
  1. Binary Search Tree?
  2. 장점
  3. C언어로 구현하기(Search, Insert, Delete)
  4. 1. Search
  5. 2. Insert
  6. 3. delete
'CS/자료구조' 카테고리의 다른 글
  • [자료구조] AVL Tree C언어로 구현하기 (Insertion, Delete)
  • [자료구조] 배열과 동적 메모리 할당 in C언어
  • [자료구조] Binary-Tree 이진 트리 C언어로 구현하기
  • [자료구조] Doubly 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)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

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

최근 댓글

최근 글

hELLO· Designed By정상우.v4.5.2
1in
[자료구조] Binary Search Tree (BST) C언어로 구현하기 (검색, 삽입, 삭제)
상단으로

티스토리툴바

단축키

내 블로그

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

블로그 게시글

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

모든 영역

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

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