함수의 기능과 리턴값함수인자리턴값기능tree_pointer insert_node(tree_pointer node, information info);tree_node구조체의 tree_pointer의 node와 tree_node구조체 info를 넘겨 받는다.*tree poiner형으로tree_node를 가리치는 포인형을 리턴한다.트리를 삽입하는 기능을가지고 있는 함수이다.void delete_node(tree_pointer node, int num);tree_pointer node이라는 트리의 위치를 넘겨받는 포인터를 넘겨받고 삭제하는 값을 num으로 넘겨 받는다.void로 리턴값이 없다.트리를 삭제하는 기능을 가진 함수이다.void printscreen(tree_pointer root2, int num);tree_pointer root2는 정렬된 트리를 인자로 넘겨 받는다void로 리턴값이 없다.화면에 출력해주는 기능을가진 함수이다void main()void로 아무것도 넘겨 받지 않는다void로 리턴값이 없다.트리를 입력받고 삭제, 출력, 저장, 검색을 가진 메인 함수이다.tree_pointer modified_serch(tree_pointer tree, int key);tree_pointer node이라는 트리의 위치를 넘겨받는 포인터를 넘겨받고 삭제하는 값을 num으로 넘겨 받는다.*tree poiner형으로tree_node를 가리치는 포인형을 리턴한다.입력된 트리를 검색하는 함수로써 id값으로 찾아 출력 해준다.tree_pointer parent_serch(tree_pointer tree, int key);tree_pointer tree는 이미 작성된 트리를 넘겨 받는다.*tree poiner형으로tree_node를 가리치는 포인형을 리턴한다.부모트리를 찾는 함수로 삽입이나 삭제를 할 때 필요하다.tree_pointer max_left_serch(tree_pointer tree);tree_pointer tree는 이미 작성된 트리를 넘겨 받는다.*tree t->id;max_left->id = change_key;strcpy(swap,temp->name);//이름 바꿈.strcpy(max_left->name,swap);strcpy(temp->name,max_left->name);strcpy(swap,temp->work);//직업strcpy(max_left->work,swap);strcpy(temp->work,max_left->work);strcpy(swap,temp->service_place);//부서strcpy(max_left->service_place,swap);strcpy(temp->service_place,max_left->service_place);//parent_temp = temp;delete_node(max_left,max_left->id); //왼쪽 자식의 재귀함수.}else if(temp->right_child) {root = temp->right_child;temp=NULL;}}부모 노드가 없을 때 함수로 코딩하는 부분에서 생각을 먼저 하고 코딩을 했어야 했는데 그냥 맞춰서 하다 보니, 시간도 오래 걸렸고 나중엔 안 되는 경우가 생겨 애를 많이 먹었다. 나중에 곰곰이 생각한 후 코딩을 해보니 완벽하게 삭제가 된다. root노드를 삭제하는 경우와 마찬가지 인데 자식이 둘다 없을땐 root가 NULL을 가리치고, 왼쪽 자식만 있을 때는 왼쪽자식의 오른쪽 자식을 찾고 있으면 root와 바꾸고 삭제 한다. 만약 둘다 없으면 그 왼쪽 자식과 바꾸고 또 왼쪽 자식이 있으면 그 자식과 다시 바꾼 후 자식이 둘다 없을때 삭제 한다. 또한 오른쪽 자식만 있을 경우에는 root가 오른쪽 자식을 가리킨다. 이 함수의 알고리즘이다.#include #include #include #include #define MAX_STACK_SIZE 50typedef struct tree_node *tree_pointer;typedef struct tree_node {int id;char name[20];char work[15];;printf("t┃ A. 트리 삽입 ┃n");printf("t┃ D. 트리 삭제 ┃n");printf("t┃ P. 트리 화면출력 ┃n");printf("t┃ W. 트리 검색 ┃n");printf("t┃ S. 트리 파일저장 ┃n");printf("t┃ Q. 프로그램 종료 ┃n");printf("t┃ ┃n");printf("t┗━━━━━━━━━━━━━┛n");printf("nt실행하실 작업의 항목을 입력: ");return getche();}void insert(){information info;while(1) {printf("nntI D : ");scanf("%d",&info.id); // 숫자만 입력되게.if(info.id == -1) break;printf("t이 름 : ");scanf("%s",info.name);printf("t직 업 : ");scanf("%s",info.work);printf("t근무처 : ");scanf("%s",info.service_place);result=insert_node(root,info);if(root == NULL) root = result; //root가 NULL일때만 root를 잡음.}}void delmenu(){information info2;printf("nnt삭제하실 ID를 입력하세요n");printf("ntI D : ");scanf("%d",&info2.id);delete_node(root,info2.id);}int search_menu(){information info1;printf("nnt검색하실 ID를 입력하세요n");printf("ntI D : ");scanf("%d",&info1.id);return info1.id;}void store_menu(){char input;printf("nn");printf("t┏━Sub Menu━━━━━━━━┓n");printf("t┃ ┃n");printf("t┃ 1. 중위순회저장 ┃n");p_pointer node){ // 전위순위로파일에 저장.fp1 = fopen("C:\data_pre.txt","w");printf("ntdata_in.txt 파일로 저장했습니다!n");preorder(node);fclose(fp1);}void store_PO(tree_pointer node){ // 후위순위파일에 저장.fp2 = fopen("C:\data_post.txt","w");printf("ntdata_post.txt 파일로 저장했습니다!n");postorder(node);fclose(fp2);}tree_pointer search(tree_pointer tree,int key){ // 검색 함수.while(tree){if(tree->id==key) return tree;if(tree->id>key) tree=tree->left_child;else tree=tree->right_child;}return NULL;}void inorder(tree_pointer node){ // 중위 트리 순회if(node){inorder(node->left_child);fprintf(fp,"%d ",node->id);inorder(node->right_child);}}void preorder(tree_pointer node){ // 전위 트리 순회if(node){fprintf(fp1,"%d ",node->id);preorder(node->left_child);preorder(node->right_child);}}void postorder(tree_pointer node){ //후위 트리 순회if(node){postorder(node->left_child);postorder(node->right_child);fprintf(fp2,"%d ",node->id);}}tree_pointer max_left_serch(tree_pointer tree){while(tree) {if(tree->right_child == NULL)return tree;else {parent_rent_temp->right_child = NULL; // 자식트리가 둘다 없을때.찾은 오른쪽 자식을 NULL로 초기화}else if((temp->left_child != NULL) && (temp->right_child == NULL) || (temp->left_child == NULL) && (temp->right_child != NULL)) {//왼쪽 자식이나 오른쪽 자식이 있을때.if((temp->left_child != NULL) && (temp->right_child == NULL)) what=0; //왼쪽자식이 있을때.if((temp->left_child == NULL) && (temp->right_child != NULL)) what=1; //오른쪽자식이 있을때.if(temp->left_child) {left_temp_max= temp;max_left=max_left_serch(temp->left_child); //왼쪽 자식 찾기.}else {while(temp->right_child && (!temp->left_child)) { //여기 이상함! 5-20-15-23max_left=max_right_serch(temp->right_child); // 왼쪽 자식 없으면 오른쪽자식만 있을때.change_key = temp->id;//값을 교환temp->id = max_left->id;max_left->id = change_key;parent_temp = temp;temp = temp->right_child;}}if(temp->left_child){ //여기부분도 문제.if(num!=temp->left_child->id ){ //30-20일때 여기서 문제였음.10-52-50-45-70change_key = temp->id;//값을 교환temp->id = max_left->id;max_left->id = change_key;}if(temp->left_child->left_child) { //10-52-50-45-70때문if(temp->left_chil.