1 / 22

제 5 장 트리

제 5 장 트리. 5.4 추가연산 ( 트리 복사 ). tree_pointer copy(tree_pointer original) { tree_pointer temp; if(original){ temp = (tree_pointer) malloc(sizeof(node)); if(IS_FULL(temp)){ fprintf(stderr, ” The memory is full<br> ” ); exit(1); }

Download Presentation

제 5 장 트리

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 제5장 트리

  2. 5.4 추가연산(트리 복사) tree_pointer copy(tree_pointer original) { tree_pointer temp; if(original){ temp = (tree_pointer) malloc(sizeof(node)); if(IS_FULL(temp)){ fprintf(stderr,”The memory is full\n”); exit(1); } temp->left_child = copy(original->left_child); temp->right_child = copy(original->right_child); temp->data = original->data; return temp; } return NULL; }

  3. original 5.4 추가연산(트리 복사) + * E tree_pointer copy(tree_pointer original) { tree_pointer temp; if(original){ temp = (tree_pointer) malloc(sizeof(node)); if(IS_FULL(temp)){ fprintf(stderr,”The memory is full\n”); exit(1); } temp->left_child = copy(original->left_child); temp->right_child = copy(original->right_child); temp->data = original->data; return temp; } return NULL; } * D / C A B

  4. 5.4 추가연산(동질성검사) int equal(tree_pointer first, tree_pointer second) { return((!first && !second)|| (first && second && (first->data == second->data) && equal(first->left_child, second->left_child) && equal(first->right_child, second->right_child)); }

  5. 5.4 추가연산 • 만족성 문제 • 변수 x1, x2, …, xn과 연산자 ^(and), V(or), !(not)으로 이루어진 식 • x1V(x2^!x3) • 명제식의 만족성 문제? : 식의 값이 참이 되도록 변수에 값을 지정할 수 있는 방법이 있는가를 묻는 문제

  6. 5.4 추가연산 • 규칙 • 변수 자체도 하나의 식이다 • x,y가 식일때 !x, x^y, xVy도 식이다. • 연산 순서는 !, ^, V의 순, 괄호 사용 • 연산 • 중위순회 : x1V(x2^!x3) • 계산방법 : 전체식이 하나의 값이 될때까지 서브트리를 계산하면서 트리를 후위 순회 • O(g2n), g는 각 변수에 값을 대입하고 식을 계산

  7. 5.4 추가연산 V • x1^!x2V!x1^!x3V!x3 ^ V x3 ^ ^ x3 x1 ! ! x2 x1

  8. 5.4 추가연산 • 노드구조 typedef enum {not, and, or, true, false} logical; typedef struct node *tree_pointer; typedef struct node{ tree_pointer left_child; logical data; short int value; tree_pointer right_child; } 리프노드의 node->data는 이 노드가 나타내는 변수의 현재 값

  9. 5.4 추가연산 for(all 2n possible combinations){ generate the next combination; replace the variables by their values; if (root->value){ printf(<combination>); return; } } printf(“No satisfiable combination\n”);

  10. void post_order_eval(tree_pointer node) { if(node){ post_order_eval(node->left_child); post_order_eval(node->right_child); switch(node->data){ case not: node->value=!node->right_child->value; break; case and: node->value=node->right_child->value && node->left_child->value; break; case or: node->value=node->right_child->value || node->left_child->value; break; case true: node->value = TRUE; break; case false: node->value=FALSE; } } }

  11. V void post_order_eval(tree_pointer node) { if(node){ post_order_eval(node->left_child); post_order_eval(node->right_child); switch(node->data){ case not: node->value=!node->right_child->value; break; case and: node->value=node->right_child->value && node->left_child->value; break; case or: node->value=node->right_child->value || node->left_child->value; break; case true: node->value = TRUE; break; case false: node->value=FALSE; } } } ^ V x3 ^ ^ x3 x1 ! ! x2 x1

  12. ^ 5.5 스레드 이진트리 x1 ! • 이진트리 • 실제 포인터보다 더 많은 널 링크 존재 • 2n개의 링크중 n+1개의 널링크 존재 • 이런 널 링크를 활용 <= 스레드(thread) (널링크=> 다른링크를 가리키는 포인터) x2

  13. 5.5 스레드 이진트리 • 스레드(thread) • 널 링크 필드에 삽입된 포인터 • ptr->left_child = NULL => ptr->left_child <=중위순회시 P의 predecessor에 대한 포인터 (2) ptr->right_child = NULL => ptr->right_child <=중위순회시 P의 successor에 대한 포인터

  14. 5.5 스레드 이진트리 A • 중위순회 :HDIBEAFCG B C D E F G H I

  15. 5.5 스레드 이진트리 • 스레드 이진 트리의 기억장소 표현 • left_thread = T left_child : normal pointer F left_child : thread • right_thread = T right_child : normal pointer F right_child : thread left_thread left_child DATA right_child right_thread

  16. 5.5 스레드 이진트리 typedef struct threaded_tree *thread_pointer; typedef struct threaded_tree{ short int left_thread; threaded_pointer left_child; char data; threaded_pointer right_child; short int right_thread; }

  17. 5.5 스레드 이진트리 A • 제일왼쪽 • 제일오른쪽 B C D E F G H I

  18. ptr f . -- . f f . A . f f . B . f f . C . f f . D . f t . E . t t . F . t t . G . t t . H . t t . I . t

  19. 5.5 스레드 이진트리 • 스레드 이진트리의 중위순회 void tinorder(threaded_pointer tree) { threaded_pointer temp=tree; for (;;){ temp=insucc(temp); if(temp=tree) break; printf(“%3c”, temp->data); } }

  20. 5.5 스레드 이진트리 threaded_pointer insucc(threaded_pointer tree) { threaded_pointer temp; temp=tree->right_child; if(!tree->right_thread) while(!temp->left_thread) temp=temp->left_child; return temp; }

  21. 5.5 스레드 이진트리 • If ptr->right_thread = FALSE : ptr의 오른쪽 자식부터 시작하여 왼쪽 자식 링크를 따라 left_child=TRUE인 노드를 찾음

  22. 과제물 • 스레드 이진 트리를 이용한 중위순회 프로그램 작성

More Related