#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 |