/** * Prints the keys in the tree out preorder. * @param t tree to print. * @param f(char *s) printing function to use. */ void tree_preorder(tree t, void f(char *s)) { if(t == NULL){ return; }else{ f(t->key); tree_preorder(t->left,f); tree_preorder(t->right,f); } }
//전위 순회 //트리 노드를 인자로 받음 void tree_preorder(TreeNode *root) { if(root){ //현재 노드의 데이터 출력 printf("%d ", root->data); //루트 노드의 왼쪽 자식노드인 전위 순회 실행 tree_preorder(root->left); //루트 노드의 오른쪽 자식노드인 전위 순회 실행 tree_preorder(root->right); } }
int main(void) { //트리를 구성할 루트노드 TreeNode *root=NULL; //트리에 넣을 값들을 받을 정수형 배열 int val[100]; //반복 구문을 수행할 정수형 변수 int i, j; //트리에 구성할 값들을 입력 받기 //설명문 출력 printf("트리를 구성할 값을 입력하세요.\n(정수 범위: 1~100 / 최대 100개 입력 가능 / 종료는 101)\n"); //트리에 넣을 값을 배열에 저장(최대 100번 반복) for(i=0;i<100;i++) { //트리에 넣을 값 입력 scanf("%d", &val[i]); //101를 입력받으면 반복 종료 if(val[i]==101) break; //입력 범위를 초과하면 else if(val[i]>101) //오류 메세지 출력 error("값을 초과하였습니다."); } //입력 값 출력 및 입력 값 트리에 삽입 printf("\n입력 값 \n"); //입력 한 값들의 갯수만큼 반복 for(j=0;j<i;j++) { //입력 값 확인을 위한 출력 printf("%d ", val[j]); //입력 값 트리에 삽입 tree_insert_node(&root, val[j]); } //출력 구분을 위한 개행 printf("\n-------------------------------------------------------\n"); //전위 순회 함수를 통해 전위 순회 출력 printf("전위 순회 출력 결과\n"); tree_preorder(root); //중위 순회 함수를 통해 전위 순회 출력 printf("\n중위 순회 출력 결과\n"); tree_inorder(root); //후위 순회 함수를 통해 전위 순회 출력 printf("\n후위 순회 출력 결과\n"); tree_postorder(root); printf("\n"); //입력 받은 값 트리에서 삭제하기 //설명문 출력 printf("\n트리에서 삭제할 값을 순서대로 입력하세요!(종료는 101) \n"); //트리에서 삭제할 값 배열에 저장(최대 100번 반복) for(i=0;i<100;i++) { //삭제할 값 입력 scanf("%d", &val[i]); //101을 입력받으면 반복 종료 if(val[i]==101) break; //입력 범위를 초과하면 else if(val[i]>101) //오류 메세지 출력 error("값을 초과하였습니다."); } //입력 값 출력 및 입력 값 트리에서 삭제 printf("\n입력 값 \n"); //입력 한 값들의 갯수만큼 반복 for(j=0;j<i;j++) { //삭제 값 확인을 위한 출력 printf("%d ", val[j]); //트리에서 해당되는 노드 삭제 tree_delete_node(&root, val[j]); } //출력 구분을 위한 개행 printf("\n-------------------------------------------------------\n"); //트리 노드 개수 구하는 함수를 통한 개수 출력 printf("삭제 후 트리의 노드 개수 : %d\n", tree_get_node_count(root)); //트리 높이 구하는 함수를 통한 높이 출력 printf("삭제 후 트리의 높이 : %d\n", tree_height(root)); //레벨 순회 함수를 통한 레벨 순회 출력 printf("삭제 후 트리의 레벨 순회 \n"); tree_level_order(root); printf("\n"); system("pause"); return 0; }
/** * Gathers input from the command line and responds to the given * arguments. * Refer to help menu (-h) for more information. * * @param argc count the number of arguments on the command line. * @param argv[] array of arguments. * * @return exit success or exit failure. */ int main (int argc, char *argv[]){ char word[256]; const char *optstring = "c:df:orh"; char option; tree h; tree_t tree_type = BST; FILE *outfile; char* out = NULL; FILE *filename; int unknown = 0; clock_t fill_start,fill_end, search_start, search_end; int cflag = 0; int dflag = 0; int oflag = 0; while ((option = getopt(argc,argv,optstring)) != EOF){ switch(option){ case'f': out = optarg; break; case 'o': oflag = 1; break; case 'r': tree_type = RBT; break; case 'd': dflag = 1; break; case 'c': if (NULL == (filename = fopen(optarg, "r"))) { fprintf(stderr, "%s: can't find file %s\n", argv[0], argv[1]); return EXIT_FAILURE; } cflag = 1; break; case 'h': print_usage(argv[0]); exit(EXIT_FAILURE); break; default: print_usage(argv[0]); exit(EXIT_FAILURE); } } if (out == NULL){ out = "tree-view.dot"; } h = tree_new(tree_type); fill_start = clock(); while (getword(word, sizeof word, stdin) != EOF){ h = tree_insert(h,word); } fill_end = clock(); if (oflag == 1){ outfile = fopen(out, "w"); tree_output_dot(h, outfile); fprintf(stderr,"Creating dot file '%s'\n",out ); fclose(outfile); } if (cflag == 1){ dflag = 0; oflag = 0; search_start = clock(); while (getword(word, sizeof word, filename) != EOF){ if (tree_search(h, word) == 0){ printf("%s\n", word); unknown++; } } search_end = clock(); fclose(filename); fprintf(stderr, "Fill time : %7f\nSearch time : %7f\nUnknown words = %d\n", \ (fill_end-fill_start)/(double)CLOCKS_PER_SEC, \ (search_end-search_start)/(double)CLOCKS_PER_SEC, unknown); } if (dflag == 1){ printf("%d\n",tree_depth(h)); }else if (dflag == 0 && cflag == 0 && oflag == 0){ tree_preorder(h, print_info); } tree_free(h); return EXIT_SUCCESS; }