CH 5 Tree Contents 1 Tree 2 Binary
CH 5 Tree
Contents 1 트리(Tree)의 개념 2 이진트리(Binary Tree) 3 이진검색트리(Binary Search Tree) 4 AVL 트리 5 B 트리
이진트리(Binary Tree)
이진트리(Binary Tree)
이진트리(Binary Tree)
이진트리(Binary Tree) v 이중 연결 리스트와 유사한 방식의 노드 구조 struct bin_node { char data; struct bin_node *l_child; struct bin_node *r_child; };
이진트리(Binary Tree)
이진트리(Binary Tree) void main() { struct bin_node *root; . . . preorder(root); } void preorder (struct bin_node *tree) { if(tree == null) return; else { printf("%c ", tree->data); //루트 노드 방문 preorder(tree->l_child); //왼쪽 부트리로 preorder(tree->r_child); //오른쪽부트리로 } }
이진트리(Binary Tree) preoder() if() else printf(); preorder();
이진트리(Binary Tree) void main() 100 200 A ^ 100 root preorder(root); 200 300 B ^ void preorder (struct bin_node *tree) 100 300 ^ C ^ tree
이진트리(Binary Tree)
이진트리(Binary Tree) void inorder (struct bin_node *tree) { if(tree == null) return; else { inorder(tree->l_child); //왼쪽 부트리로 printf("%c ", tree->data); //루트 노드 방문 inorder(tree->r_child); //오른쪽 부트리로 } } 중위순회 결과: B, E, K, A, C, G ( )A( ) ((∧)B( ))A(( )C( )) ((∧)B((∧)E( )))A(( ∧ )C(( )G( ))) ((∧)B((∧)E((∧)K(∧))))A ((∧)C((∧)G(∧)))
이진트리(Binary Tree) void postorder (struct bin_node *tree) { if(tree == null) return; else { postorder(tree->l_child); //왼쪽 부트리로 postorder(tree->r_child); //오른쪽 부트리로 printf("%c ", tree->data); //루트 노드 방문 } } 후위순회 결과: K, E, B, G, C, A ( )A ((∧)( )B)((∧)( )C)A ((∧)( )E)B)((∧)(∧)G)C)A ((∧)((∧)(∧)K)E)B)((∧)(∧)G)C)A
이진검색트리(Binary Search Tree)
이진검색트리(Binary Search Tree) v Binary Search Tree의 구현 (Simple version) #include "stdio. h" #include "string. h" struct list { struct list *left; int data; struct list *right; }; 30 400 200
이진검색트리(Binary Search Tree) void main() { struct list *root, *insert(), *srch(), *modi(), *delet(), *temp; int key, data, sdata; void prnt(), inp(); FILE *fp; root= NULL; do{ printf("n Input(file)-1 Input(keyboard)-2 Display-3 Search-4 Update-5 Delete-6 End-7 n"); printf("n Select a key --->"); scanf("%d", &key);
이진검색트리(Binary Search Tree) if(key == 1) { printf("n---input---n"); fp= fopen("binary. dat", "r"); if(fp != NULL) while(fscanf(fp, "%d", &data) != EOF) { printf(“data=%dn", data); root= insert(root, data); } else printf("fopen errorn"); }
이진검색트리(Binary Search Tree) if(key == 2) { // 키보드에서 삽입할 데이터값을 입력받음 scanf("%d", &data); root= insert(root, data); } if(key == 3) { printf("n---display ---n"); printf("nlevel datan"); prnt(root, 1); } if(key == 4) { printf("n---search ---n"); printf(" data---> "); scanf("%d", &sdata); temp= srch(root, sdata); }
이진검색트리(Binary Search Tree) if(key == 5) { printf("n---delete---n"); printf(" data---> "); scanf("%d", &sdata); root= delet(root, sdata); } if(key == 6) { printf("n---end---n"); } }while(key < 6); } //재귀적으로 트리를 순회하면서 입력위치를 결정
이진검색트리(Binary Search Tree) struct list *insert(struct list *rp, int data) { struct list *create_node(); if(rp == NULL) { //트리가 비어있는 상태 rp= create_node(); //하나의 노드를 할당받아 rp->data= data; rp->left= NULL; rp->right= NULL; }
이진검색트리(Binary Search Tree) else if( data == rp->data ) { //이미 데이터가 존재할 때 printf("n---------------n"); printf(“Existing data %dn”, data); printf("n---------------n"); } else if(data < rp->data ) //왼쪽 부트리로 이동 rp->left= insert(rp->left, data); else //오른쪽 부트리로 이동 rp->right= insert(rp->right, data); return(rp); }
이진검색트리(Binary Search Tree) struct list *create_node() { char *malloc(); return((struct list *)malloc(sizeof(struct list ))); }
이진검색트리(Binary Search Tree) void prnt(struct list *pp, int lev) { if(pp != NULL) { //중위 순회 알고리즘을 활용한 출력 prnt(pp->left, lev+1); printf("%2 d %-2 d n", lev, pp->data); prnt(pp->right, lev+1); } }
이진검색트리(Binary Search Tree) struct list *srch(struct list *sp, int data) { int cmp; if(sp != NULL) { if(data == sp->data) { printf("n data = %d n", sp->data); } else if(data < sp->data) sp->left= srch(sp->left, data); else sp->right= srch(sp->right, data); } else printf("Search Fail: %s is not exist in the tree n", data); return(sp); }
이진검색트리(Binary Search Tree) v Binary Search Tree의 구현 (Original version) #include "stdio. h" #include "string. h" #define YES 1 #define NO 0 #define LIST struct list LIST { LIST *left; char *name; char *tel; LIST *right; };
이진검색트리(Binary Search Tree) void main() { LIST *root, *insert(), *srch(), *modi(), *delet(), *temp; char name[15], tel[15]; int key; void prnt(), inp(); FILE *fp; root= NULL; do{ printf("n Input(file)-1 Input(keyboard)-2 Display-3 Search-4 Update-5 Delete-6 End-7 n"); printf("n Select a key --->"); scanf("%d", &key);
이진검색트리(Binary Search Tree) if(key == 1) { printf("n---input---n"); fp= fopen("binary. dat", "r"); if(fp != NULL) while(fscanf(fp, "%s %s", name, tel) != EOF) { printf("name=%s tel=%sn", name, tel); root= insert(root, name, tel); } else printf("fopen errorn"); }
이진검색트리(Binary Search Tree) if(key == 2) { // 키보드에서 삽입할 데이터값을 입력받음 inpt(name, tel); root= insert(root, name, tel); } if(key == 3) { printf("n---display ---n"); printf("nlevel name tel n"); prnt(root, 1); } if(key == 4) { printf("n---search ---n"); printf(" name---> "); scanf("%s", cname); temp= srch(root, cname); }
이진검색트리(Binary Search Tree) if(key == 5) { printf("n---update---n"); printf(" name---> "); scanf("%s", cname); modi(root, name); } if(key == 6) { printf("n---delete---n"); printf(" name---> "); scanf("%s", name); root= delet(root, name); }
이진검색트리(Binary Search Tree) LIST *insert(LIST *rp, char *name, char *tel) { LIST *create_node(); char *strsv(); int cmp; if(rp == NULL) { //트리가 비어있는 상태 rp= create_node(); //하나의 노드를 할당받아 rp->name= strsv(name); //데이터 필드와 연결필드를 설정 rp->tel= strsv(tel); rp->left= rp->right= NULL; }
이진검색트리(Binary Search Tree) else if((cmp=strcmp(name, rp->name)) == 0) { //이미 데이터가 존재 할 때 printf("n---------------n"); printf(“Existing NAME = %-15 s TEL= %-13 s n", rp->name, rp->tel); printf("n---------------n"); } else if(cmp < 0) //왼쪽 부트리로 이동 rp->left= insert(rp->left, name, tel); else //오른쪽 부트리로 이동 rp->right= insert(rp->right, name, tel); return(rp); }
이진검색트리(Binary Search Tree) void inpt(char *name, char *tel) { printf("nname ---> "); scanf("%s", name); printf("n tel--->"); scanf("%s", tel); } LIST *create_node() { char *malloc(); return((LIST *)malloc(sizeof(LIST))); }
이진검색트리(Binary Search Tree) char *strsv(char *sl) { //입력받은 데이터크기+1 만큼의 공간을 확보하여 데이터를 복사한다 char *p, *malloc(); if((p = malloc(strlen(sl) + 1)) != NULL) //EOL을 위한 공간 확보 strcpy(p, sl); return(p); } void prnt(LIST *pp, int lev) { if(pp != NULL) { //중위 순회 알고리즘을 활용한 출력 prnt(pp->left, lev+1); printf("%2 d %-14 s %15 s n", lev, pp->name, pp->tel); prnt(pp->right, lev+1); } }
이진검색트리(Binary Search Tree) LIST *srch(LIST *sp, char *snam) { int cmp; if(sp != NULL) { if((cmp=strcmp(snam, sp->name)) == 0) { printf("n name tel n"); printf("----------n"); printf("%-14 s %-15 s n", sp->name, sp->tel); } else if(cmp < 0) sp->left= srch(sp->left, snam); else sp->right= srch(sp->right, snam); } else printf("Search Fail: %s is not exist in the tree n", snam); return(sp); }
이진검색트리(Binary Search Tree) LIST *modi(LIST *mp, char *mnam) {char mtel[15]; int cmp; char *temp; if(mp != NULL) { if((cmp=strcmp(mnam, mp->name)) == 0) { printf("tel--> "); scanf("%s", mtel); temp= mp->tel; mp->tel= strsv(mtel); free(temp); } else if(cmp < 0) mp->left= modi(mp->left, mnam); else mp->right= modi(mp->right, mnam); } else printf("Search Fail: %s is not exist in the tree n", mnam); return(mp); }