3.4.2 이진 탐색 트리 코드
테스트 로직을 구현합시다.
테스트 로직은 단순히 이진 탐색 트리를 생성한 후에 다양한 도서 정보를 추가하고 검색과 삭제 기능 등을 호출하여 잘 동작하는지 확인하는 것입니다.
이 부분에 관한 별도의 설명은 생략할게요.
▷BinSearchTree.h
#pragma once
#include "Book.h"
typedef struct _Node Node;
struct _Node
{
Book *book;
Node *lch;
Node *rch;
Node *pa;
};
Node *New_Node(Book *data);
typedef struct _BinSearchTree BST;
struct _BinSearchTree
{
Node *root;
int count;
};
BST *New_BST();
void Delete_BST(BST *bst);
int BST_Insert(BST *bst,Book *book);
int BST_Remove(BST *bst, int num);
Book *BST_Find(BST *bst, int num);
void BST_List(BST *bst);
▷BinSearchTree.c
#include "BinSearchTree.h"
#include <malloc.h>
Node *New_Node(Book *data)
{
Node *node = 0;
node = (Node *)malloc(sizeof(Node));
node->book = data;
node->lch = node->rch = node->pa = 0;
return node;
}
BST *New_BST()
{
BST *bst = 0;
bst = (BST *)malloc(sizeof(BST));
bst->root = 0;
bst->count = 0;
return bst;
}
void BST_PostOrder(Node *sr);
void Delete_BST(BST *bst)
{
BST_PostOrder(bst->root);
free(bst);
}
void BST_PostOrder(Node *sr)
{
if(sr)
{
BST_PostOrder(sr->lch);
BST_PostOrder(sr->rch);
Delete_Book(sr->book);
free(sr);
}
}
Node *BST_FindSeat(Node *sr,int num);
int BST_Insert(BST *bst,Book *book)
{
Node *parent = 0;
parent = BST_FindSeat(bst->root,book->num);
if(parent)
{
Node *node = 0;
int gap = parent->book->num - book->num;
if( gap == 0)
{
return 0;
}
node = New_Node(book);
node->pa = parent;
if(gap>0)
{
parent->lch = node;
}
else
{
parent->rch = node;
}
}
else
{
bst->root = New_Node(book);
}
bst->count++;
return 1;
}
Node *BST_FindSeat(Node *sr,int num)
{
int gap = 0;
if(sr==0)
{
return 0;
}
gap = sr->book->num - num;
if(gap == 0)
{
return sr;
}
if(gap>0)
{
if(sr->lch)
{
return BST_FindSeat(sr->lch,num);
}
return sr;
}
if(sr->rch)
{
return BST_FindSeat(sr->rch,num);
}
return sr;
}
void BST_Disconnect(BST *bst,Node *node);
int BST_Remove(BST *bst, int num)
{
Node *node = 0;
node = BST_FindSeat(bst->root,num);
if(node)
{
if(node->book->num == num)
{
BST_Disconnect(bst,node);
free(node);
bst->count--;
return 1;
}
}
return 0;
}
Node *BST_Change(Node *node);
void BST_Disconnect(BST *bst,Node *node)
{
Node *pa=0;
Node *ch=0;
if(node->lch && node->rch)
{
node = BST_Change(node);
}
pa = node->pa;
(ch = node->lch)||(ch = node->rch);
if(pa)
{
ch->pa = pa;
}
else
{
bst->root = ch;
}
if(ch)
{
if(pa->lch == node)
{
pa->lch = ch;
}
else
{
pa->rch = ch;
}
}
}
Node *BST_Change(Node *node)
{
Node *temp = node;
while(temp->rch)
{
temp = temp->lch;
}
node->book = temp->book;
return temp;
}
Book *BST_Find(BST *bst, int num)
{
Node *node = 0;
node = BST_FindSeat(bst->root,num);
if(node)
{
if(node->book->num == num)
{
return node->book;
}
}
return 0;
}
void BST_Inorder(Node *sr);
void BST_List(BST *bst)
{
printf("보관 개수:%d\n",bst->count);
BST_Inorder(bst->root);
}
void BST_Inorder(Node *sr)
{
if(sr)
{
BST_Inorder(sr->lch);
Book_View(sr->book);
BST_Inorder(sr->rch);
}
}
▷Program.c
#include "BinSearchTree.h"
int main()
{
Book *book = 0;
BST *bst = New_BST();
BST_Insert(bst,New_Book("C언어","홍길동",10));
BST_Insert(bst,New_Book("C++","홍길동",8));
BST_Insert(bst,New_Book("자료구조","홍길동",7));
BST_Insert(bst,New_Book("알고리즘","홍길동",12));
BST_Insert(bst,New_Book("디자인패턴","홍길동",5));
BST_Insert(bst,New_Book("소켓통신","홍길동",4));
BST_List(bst);
book = BST_Find(bst,5);
if(book)
{
printf("검색 성공\n");
Book_View(book);
}
else
{
printf("검색 실패\n");
}
BST_Remove(bst,5);
BST_List(bst);
Delete_BST(bst);
return 0;
}
'언어 자료구조 알고리즘 > [C]디딤돌 자료구조와 알고리즘' 카테고리의 다른 글
[디딤돌 자료구조와 알고리즘] 5. 선형 자료구조 - 개요 (0) | 2016.05.16 |
---|---|
[디딤돌 자료구조와 알고리즘] 4.3.2 병합 정렬 알고리즘 구현 (0) | 2016.04.10 |
[디딤돌 자료구조와 알고리즘 with C] 4.3 병합 정렬 알고리즘 (0) | 2016.04.10 |
[디딤돌 자료구조와 알고리즘 with C] 4.2 이진 탐색 알고리즘 (0) | 2016.04.10 |
[디딤돌 자료구조와 알고리즘 with C] 4. 분할 정복 알고리즘 (0) | 2016.04.10 |
[디딤돌 자료구조와 알고리즘 with C] 3.4 이진 탐색 트리 (0) | 2016.04.10 |
[디딤돌 자료구조와 알고리즘 with C] 3.3.2 퀵 정렬 알고리즘 구현 (0) | 2016.04.10 |
[디딤돌 자료구조와 알고리즘 with C] 3.3 퀵 정렬 알고리즘 (0) | 2016.04.10 |
[디딤돌 자료구조와 알고리즘 with C] 3.2 하노이 타워 (0) | 2016.04.10 |
[디딤돌 자료구조와 알고리즘 with C] 3. 재귀 알고리즘 (0) | 2016.04.10 |