| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
Tags
- 영어회화
- 안드로이드
- Realtime Database
- cloud firestore
- 젠킨스
- 파이썬
- meta threads
- 쓰레드 이미지 다운로드
- 객치지향프로그래밍
- 이모티콘
- jenkins
- Python
- 라이브아카데미
- 자료구조
- 쓰레드 비디오 다운로드
- re-engineering
- Android
- skeleton architecture
- 메타 쓰레드
- 특수문자
- conventional NFR
- endless scrolling
- 직장영어
- Firebase
- firestore
- non conventional NFR
- django
- RecyclerView
- 특수기호
- git
Archives
- Today
- Total
Owl Life
자료구조_Binary Search Tree (BST) 본문
반응형
Binary Search Tree 자료구조입니다.
메모리는 동적이 아닌 정적으로 잡아서 사용하고 있으니, 필요시 동적할당으로 수정하시면 됩니다.
소스는 아래 참고 바랍니다.
#include "iostream"
using namespace std;
#define MAX_DATA 10000
#define INIT_DATA -1
typedef int T;
typedef struct _node {
T data;
struct _node *left, *right;
} NODE;
NODE tree[MAX_DATA + 1];
NODE *root_node;
int tree_idx;
NODE *alloc_node() {
return &tree[tree_idx++];
}
void init() {
for (int i = 0; i < MAX_DATA; i++) {
tree[i].data = INIT_DATA;
tree[i].left = tree[i].right = 0;
}
root_node = 0;
tree_idx = 0;
}
NODE* insert_to_bst(NODE* node, T data) {
if (node == 0) {
node = alloc_node();
node->data = data;
return node;
}
if (node->data > data) {
node->left = insert_to_bst(node->left, data);
return node;
}
if (node->data < data) {
node->right = insert_to_bst(node->right, data);
return node;
}
return 0;
}
NODE* find_leastnode(NODE* node) {
while (node && node->left) {
node = node->left;
}
return node;
}
NODE* find_mostnode(NODE* node) {
while (node && node->right) {
node = node->right;
}
return node;
}
NODE* delete_from_bst(NODE *node, T data) {
if (node == 0) {
return 0;
}
if (data < node->data) {
node->left = delete_from_bst(node->left, data);
return node;
}
if (data > node->data) {
node->right = delete_from_bst(node->right, data);
return node;
}
node->data = INIT_DATA;
// 단말 노드일 경우
if (node->left == 0 && node->right == 0) {
return node;
}
// 한쪽만 존재
if (node->left == 0) {
return node->right;
}
if (node->right == 0) {
return node->left;
}
// 둘다 존재하는 경우
NODE *successor_node = find_leastnode(node->right);
node->data = successor_node->data;
node->right = delete_from_bst(node->right, successor_node->data);
return node;
}
void add_data(T data) {
NODE* node = insert_to_bst(root_node, data);
if (root_node == 0) {
root_node = node;
}
}
void delete_data(T data) {
root_node = delete_from_bst(root_node, data);
}
void pre_order(NODE* node) {
if (node == 0 || node->data == INIT_DATA) {
return;
}
cout << node->data << " -> ";
pre_order(node->left);
pre_order(node->right);
}
void in_order(NODE* node) {
if (node == 0 || node->data == INIT_DATA) {
return;
}
pre_order(node->left);
cout << node->data << " -> ";
pre_order(node->right);
}
NODE *find_node(NODE *node, T data) {
if (node == 0) {
cout << "Not found data : " << data << endl;
return 0;
}
if (node->data == data) {
cout << "Found a data : " << data << endl;
return node;
}
if (node->data < data) {
return find_node(node->right, data);
}
if (node->data > data) {
return find_node(node->left, data);
}
return 0;
}
void test_add() {
init();
add_data(50);
add_data(30);
add_data(25);
add_data(35);
add_data(4);
add_data(7);
add_data(70);
add_data(69);
pre_order(root_node);
}
void test_delete() {
init();
add_data(50);
add_data(30);
add_data(25);
add_data(35);
add_data(4);
add_data(7);
add_data(70);
add_data(69);
pre_order(root_node);
cout << endl;
delete_data(50);
delete_data(30);
delete_data(25);
delete_data(35);
delete_data(4);
delete_data(7);
delete_data(70);
pre_order(root_node);
}
void test_search() {
init();
add_data(50);
add_data(30);
add_data(25);
add_data(35);
add_data(4);
add_data(7);
add_data(70);
add_data(69);
pre_order(root_node);
cout << endl;
find_node(root_node, 68);
find_node(root_node, 69);
}
int main() {
// test_add();
// test_delete();
// test_close_data();
test_search();
return 0;
}
반응형
'자료구조_알고리즘' 카테고리의 다른 글
| 덱(deque) 자료구조 (0) | 2018.06.07 |
|---|---|
| 자료구조_Double Linked List (DLL) (0) | 2018.05.11 |
Comments