본문 바로가기
알고리즘(C언어)/이것이 자료구조+알고리즘이다(박상현)_자료구조

(12)[Chapter6]이진 탐색 트리_탐색,삽입메소드(이론 + 코드)

by 코잼민 2024. 7. 23.

##이진 탐색 트리_Search()

##이진 탐색 트리_Insert() (비재귀)

##이진 탐색 트리_Insert() (재귀) :

  • ★삽입 재귀버전은 재귀인데도, 종료조건이 따로 없다 (굳이 있다면, 저 빈트리일때가 종료조건임)
  • 논리 순서 : 

1_ 빈트리라면  : "if(*root==NULL)",

2_ data가 들어갈 자리를 탐색 하면서, 재귀 호출 :

##이진 탐색 트리_오름차순 출력 => 중위 순회

##전체 코드

 

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#include <stdio.h>
#include <stdlib.h>
#pragma warning (disable : 4996)
 
typedef struct _BSTNode {
    int data;
    struct _BSTNode* left;
    struct _BSTNode* right;
} BNode;
 
// 이진 탐색 트리의 탐색 메소드(재귀)
BNode* BSTSearch(BNode* root, int data) {
    // 1. 종료 조건
    if (root == NULLreturn NULL;
 
    // 2. 탐색 시작
    if (root->data == data) return root;
    else if (root->data > data) return BSTSearch(root->left, data);
    else return BSTSearch(root->right, data);
}
 
// 이진 탐색 트리 삽입 메소드 (비재귀 + 이중 포인터)
void BSTInsert(BNode** root, int data) {
    // 1. 빈 트리라면,
    if (*root == NULL) {
        *root = (BNode*)malloc(sizeof(BNode));
        (*root)->data = data;
        (*root)->left = NULL;
        (*root)->right = NULL;
        return;
    }
 
    // 2. 빈 트리가 아니라면,
    BNode* P = *root;
    BNode* C = NULL;
 
    while (P != NULL) {
        // 발자취 남기기
        C = P;
 
        if (P->data > data) // 왼쪽으로 포인터 이동
        {
            P = P->left;
        }
        else if (P->data < data) {
            P = P->right;
        }
        else {
            printf("%d는 이미 트리에 중복된 값\n", data);
            return;
        }
    }
 
    // newNode 할당
    BNode* newNode = (BNode*)malloc(sizeof(BNode));
    newNode->data = data;
    newNode->left = NULL;
    newNode->right = NULL;
 
    if (C->data > data) {
        C->left = newNode;
    }
    else {
        C->right = newNode;
    }
 
    return;
}
 
 
// 이진 탐색 트리 삽입 메소드 (재귀)
void BSTInsertRecursive(BNode** root, int data) {
    // 1. 현재 노드가 NULL이면 새로운 노드를 생성하여 삽입
    if (*root == NULL) {
        *root = (BNode*)malloc(sizeof(BNode));
        (*root)->data = data;
        (*root)->left = NULL;
        (*root)->right = NULL;
        return;
    }
 
    // 2. 현재 노드의 값과 비교하여 왼쪽 또는 오른쪽으로 재귀 호출
    if ((*root)->data > data) 
    {
        BSTInsertRecursive(&((*root)->left), data);
    }
    else if ((*root)->data < data) 
    {
        BSTInsertRecursive(&((*root)->right), data);
    }
    else 
    {
        printf("%d는 이미 트리에 중복된 값\n", data);
        return;
    }
}
 
 
 
 
// 이진 탐색 트리 출력 (중위 순회 하면, 오름차순 출력)
void InOrder(BNode* root) {
    if (root == NULLreturn;
 
    // L
    if (root->left != NULL) InOrder(root->left);
 
    // D
    printf(" %d", root->data);
 
    // R
    if (root->right != NULL) InOrder(root->right);
}
 
int main() {
    BNode* Tree1 = NULL;
 
    BSTInsert(&Tree1, 23);
    BSTInsert(&Tree1, 11);
    BSTInsert(&Tree1, 1);
    BSTInsert(&Tree1, 139);
    BSTInsert(&Tree1, 67);
 
    InOrder(Tree1);
    printf("\n");
 
    return 0;
}
 
cs