include stdio h include stdlib h include memory
링크 표현법 프로그램 #include <stdio. h> #include <stdlib. h> #include <memory. h> typedef struct Tree. Node { int data; struct Tree. Node *left, *right; } Tree. Node; // n 1 // / | // n 2 n 3 void main() { Tree. Node *n 1, *n 2, *n 3; n 1= (Tree. Node *)malloc(sizeof(Tree. Node)); n 2= (Tree. Node *)malloc(sizeof(Tree. Node)); n 3= (Tree. Node *)malloc(sizeof(Tree. Node)); C로 쉽게 풀어쓴 자료구조 © 생능출판사 2011
후위 순회 알고리즘 n 순환 호출을 이용한다. postorder(x) if x≠NULL then C로 쉽게 풀어쓴 자료구조 postorder(LEFT(x)); postorder(RIGHT(x)); print DATA(x); © 생능출판사 2011
순회 프로그램 typedef struct Tree. Node { int data; struct Tree. Node *left, *right; } Tree. Node; // 15 // 4 20 // 1 16 25 Tree. Node n 1={1, NULL}; Tree. Node n 2={4, &n 1, NULL}; Tree. Node n 3={16, NULL}; Tree. Node n 4={25, NULL}; Tree. Node n 5={20, &n 3, &n 4}; Tree. Node n 6={15, &n 2, &n 5}; Tree. Node *root= &n 6; C로 쉽게 풀어쓴 자료구조 © 생능출판사 2011
// 후위 순회 postorder( Tree. Node *root ) { if ( root ) { postorder( root->left ); postorder( root->right ); printf("%d", root->data ); } } void main() { inorder(root); preorder(root); postorder(root); } C로 쉽게 풀어쓴 자료구조 © 생능출판사 2011 // 왼쪽서브트리 순회 // 오른쪽서브트리순회 // 노드 방문
레벨 순회 알고리즘 n 1. 2. 3. 4. 5. 6. 7. 8. 9. level_order(root) initialize queue; enqueue(queue, root); while is_empty(queue)≠TRUE do x← dequeue(queue); if ( x≠NULL) then print DATA(x); enqueue(queue, LEFT(x)); enqueue(queue, RIGHT(x)); end; C로 쉽게 풀어쓴 자료구조 © 생능출판사 2011
수식 트리 알고리즘 evaluate(exp) 1. 2. 3. 4. 5. 6. if exp = NULL then return 0; else x←evaluate(exp->left); y←evaluate(exp->right); op←exp->data; return (x op y); C로 쉽게 풀어쓴 자료구조 © 생능출판사 2011
프로그램 typedef struct Tree. Node { int data; struct Tree. Node *left, *right; } Tree. Node; // + // * + // 1 4 16 25 Tree. Node n 1={1, NULL}; Tree. Node n 2={4, NULL}; Tree. Node n 3={'*', &n 1, &n 2}; Tree. Node n 4={16, NULL}; Tree. Node n 5={25, NULL}; Tree. Node n 6={'+', &n 4, &n 5}; Tree. Node n 7={'+', &n 3, &n 6}; Tree. Node *exp= &n 7; C로 쉽게 풀어쓴 자료구조 © 생능출판사 2011
int evaluate(Tree. Node *root) { if ( root == NULL) return 0; if ( root->left == NULL && root->right == NULL) return root->data; else { int op 1 = evaluate(root->left); int op 2 = evaluate(root->right); switch(root->data){ case '+': return op 1+op 2; case '-': return op 1 -op 2; case '*': return op 1*op 2; case '/': return op 1/op 2; } } return 0; } void main() { printf("%d", evaluate(exp)); } C로 쉽게 풀어쓴 자료구조 © 생능출판사 2011
디렉토리 용량 계산 프로그램 int calc_direc_size(Tree. Node *root) { int left_size, right_size; if ( root ) { left_size = calc_direc_size( root->left ); right_size = calc_direc_size(root->right ); return (root->data+left_size+right_size); } return 0; } void main() { Tree. Node n 4={500, NULL}; Tree. Node n 5={200, NULL}; Tree. Node n 3={100, &n 4, &n 5}; Tree. Node n 2={50, NULL}; Tree. Node n 1={0, &n 2, &n 3}; printf("디렉토리의 크기=%dn", calc_direc_size(&n 1)); © 생능출판사 2011 } C로 쉽게 풀어쓴 자료구조
이진 탐색 트리에서의 탐색 연산 search(x, k) if x=NULL then return NULL; if k=x->key then return x; else if k<x->key then return search(x->left, k); else return search(x->right, k); C로 쉽게 풀어쓴 자료구조 // 탐색 실패 // 탐색 성공 // 계속 탐색 © 생능출판사 2011
순환적인 방법 //순환적인 탐색 함수 Tree. Node *search(Tree. Node *node, int { if ( node == NULL ) return NULL; if ( key == node->key ) return node; else if ( key < node->key ) return search(node->left, key); else return search(node->right, key); } C로 쉽게 풀어쓴 자료구조 © 생능출판사 2011 key) (1) (2) (3)
반복적인 방법 // 반복적인 탐색 함수 Tree. Node *search(Tree. Node *node, int key) { Tree. Node *tmp = node; while (tmp != NULL) { if ( key == tmp->key ) return tmp; // 성공 else if ( key < tmp->key ) tmp = tmp->left; // 계속 탐색 else tmp = tmp->right; // 계속 탐색 } return NULL; // 탐색에 실패했을 경우 NULL 반환 } C로 쉽게 풀어쓴 자료구조 © 생능출판사 2011
이진 탐색 트리에서의 삽입 연산 insert_node(T, key) p←NULL; // t의 부모 노드 역할 t←T; // T로부터 지정함 while t≠NULL do { p←t; if key < p->key then t←p->left; else t←p->right; } z←make_node(key); if p=NULL then T←z; // 트리가 비어있음 else if key < p->key then p->left←z else p->right←z C로 쉽게 풀어쓴 자료구조 © 생능출판사 2011
이진 탐색 트리의 응용: 영어 사전 프로그램의 메뉴 : n 자료 구조의 예 : n // 데이터 형식 typedef struct { char word[MAX_WORD_SIZE]; char meaning[MAX_MEANING_SIZE]; } element; typedef struct Tree. Node { element item; struct Tree. Node *left, *right; } Tree. Node; // e 1 < e 2 -> -1 반환 // e 1 == e 2 -> 0 반환 // e 1 > e 2 -> 1 반환 int compare(element e 1, element e 2) { return strcmp(e 1. word, e 2. word); } C로 쉽게 풀어쓴 자료구조 © 생능출판사 2011 ******** i: 입력 d: 삭제 s: 탐색 p: 출력 q: 종료 ******** i 단어: node 의미: 식물의 마디 ******** i: 입력 d: 삭제 s: 탐색 p: 출력 q: 종료 ******** …
- Slides: 74