Пример #1
0
Файл: tree.c Проект: lchish/cosc
/**
 * 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);
  }
}
Пример #2
0
//전위 순회 
//트리 노드를 인자로 받음 
void tree_preorder(TreeNode *root)
{
    if(root){
         //현재 노드의 데이터 출력 
         printf("%d ", root->data);
         //루트 노드의 왼쪽 자식노드인 전위 순회 실행
         tree_preorder(root->left);
         //루트 노드의 오른쪽 자식노드인 전위 순회 실행
         tree_preorder(root->right);
    }
} 
Пример #3
0
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;
}
Пример #4
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;
}