c·c++/c 프로그래밍

prefix 괄호 표현으로 부터 이진나무 만들기

바로이순간 2013. 6. 7. 00:32

#include <stdio.h>

#include <stdlib.h>

typedef struct _node *pnode;

typedef struct _node {

    char     label;

    pnode left;

    pnode right;

} node;

pnode makeNode(char ch) {

    pnode p=(pnode)calloc(1, sizeof(node));

    if(p==NULL) {

        printf("메모리 할당에 실패하였습니다.\n");

        exit (1);

    }

    p->label=ch;

    return p;

}

pnode prefixInsert(FILE *fp) {

    pnode pn=NULL;

    int ch;

    ch=fgetc(fp);

    if(ch=='_') { 

        return NULL; 

    } else { // 처음에는 무조건 왼괄호이다.

        ch=fgetc(fp); // label을 읽는다.

        pn=makeNode((char)ch);

        ch=fgetc(fp); // comma를 읽는다.    

        pn->left=prefixInsert(fp);

        ch=fgetc(fp); // comma를 읽는다.

        pn->right=prefixInsert(fp);

        ch=fgetc(fp); // 오른괄호를 읽는다.

    }

    return pn;

}

void preorder(pnode t) {

    if(t==NULL) { return; }

    printf("%c ", t->label);

    preorder(t->left);

    preorder(t->right);

}

void inorder(pnode t) {

    if(t==NULL) { return; }

    inorder(t->left);

    printf("%c ", t->label);

    inorder(t->right);

}

void postorder(pnode t) {

    if(t==NULL) { return; }

    postorder(t->left);

    postorder(t->right);

    printf("%c ", t->label);

}

void levelorder(pnode t) {

    pnode q[1000];       // 큐를 간단히 구현

    pnode p;

    int front=0, rear=0; // front와 rear선언

    q[rear]=t;

    rear+=1;

    while(front<rear) { // 큐에 내용이 있는 동안

        p=q[front];

        front+=1;

        printf("%c ", p->label);

        if(p->left!=NULL) {

            q[rear]=p->left;

            rear+=1;

        }

        if(p->right!=NULL) {

            q[rear]=p->right;

            rear+=1;

        }

    }

    printf("\n");

int main() {

    FILE *f1;

    char fname[80];

    pnode root;


    printf("파일이름: ");

    scanf("%s", fname);

    f1=fopen(fname, "r");

    if(f1==NULL) {

        printf("%s파일을 읽을 수 없습니다.\n", fname);

        return 1;

    }

    root=prefixInsert(f1);

    fclose(f1);

    printf("레벨오더: ");

    levelorder(root);

    printf("preorder: ");

    preorder(root);

    printf("\n");

    printf("inorder: ");

    inorder(root);

    printf("\n");

    printf("postorder: ");

    postorder(root);

    printf("\n");


    return 0;

}


위의 프로그램에 대한 입력은 다음과 같은 방식으로 준다.

(A,(B,(D,(H,(P,_,_),(Q,_,_)),(I,(R,_,_),(S,_,_))),(E,(J,(T,_,_),(U,_,_)),(K,(V,_,_),(W,_,_)))),(C,(F,(L,_,_),(M,_,_)),(G,(N,_,_),(O,_,_))))



'c·c++ > c 프로그래밍' 카테고리의 다른 글

확장된 애너그램 사전만들기  (0) 2013.07.24
단순 연결리스트를 이용한 퀵정렬  (0) 2013.07.03
로또번호 생성  (0) 2013.06.03
realloc 연습  (0) 2013.06.03
어절 역순 출력  (0) 2013.06.02