자료구조
Chapter 5-4 : Tree (Binary Search Tree)
kangyuseok
2021. 12. 9. 00:57
728x90
binary search tree는 우리가 이전에 배운 탐색 알고리즘을 용이하게 하기 위한 자료구조입니다.
각 root node의 왼쪽은 root node보다 작고 오른쪽은 root node보다 큰 수가 들어가게 되면서
어떤 수를 찾을 때 root node와 비교해주어 작으면 왼쪽으로가고 크면 오른쪽으로 가면서 탐색을하게 됩니다.
typedef struct node* tree_pointer;
typedef struct node {
int data;
tree_pointer left, right;
}node;
다음과 같은 tree 선언을 해줍니다.
Search (Recursive) 재귀함수
탐색과정을 재귀적으로 수행하는 방법입니다.
tree_pointer search(tree_pointer root, int key) {
if (!root) return NULL;
if (key == root->data) return root;
if (key < root->data) //찾는 숫자가 root node보다 작을때
return search(root->left, key);
return search(root->right, key); //찾는 숫자가 root node보다 클때
}
Search (Iterative) 반복
탐색과정을 반복적으로 수행하는 방법입니다.
tree_pointer iter_search(tree_pointer tree, int key) {
while (tree) {
if (key == tree->data)return tree;
if (key < tree->data)
tree = tree->left;
else
tree = tree->right;
}
return NULL; //못찾았을떄
}
Inserting Into A Binary Search Tree (삽입)
먼저 새로운 node를 삽입하기 전에 기존에 tree에 해당 node가 중복되지 않은지 확인해야합니다.
void insert(tree_pointer* node, int num) {
tree_pointer ptr, temp = modified_search(*node, num); //num이 기존tree에 있는지 확인
if (temp || !(*node)) {
ptr = (tree_pointer)malloc(sizeof(node));
if (IS_FULL(ptr)) {
fprintf(stderr, "The memory is full");
exif(1);
}
ptr->data = num;
ptr->left = ptr->right = NULL;
if (*node)
if (num < temp->data)
temp->left = ptr;
else temp->right = ptr;
else *node = ptr;
}
}
modified_search는 num이 기존 tree에 있는지 확인하고 있으면 NULL을 반환하고, 그게 아니면 tree의 마지막 node pointer를 반환합니다.