#include <stdio.h>
#include <stdlib.h>
typedef struct node{
char data;
struct node *lchild,*rchild;
}BNode,*BTree;
BTree createTree();
void visit(BTree T);
void preOrder(BTree T);
void inOrder(BTree T);
void postOrder(BTree T);
void layOrder(BTree T);
#define M (1000+5)
typedef BTree ElemType;
typedef struct{
ElemType data[M];
int front,rear;
}SqCyQueue;
void init(SqCyQueue *q);
int isEmpty(SqCyQueue q);
int isFull(SqCyQueue q);
int push(SqCyQueue *q,ElemType item);
int pop(SqCyQueue *q,ElemType *item);
int main(){
freopen("btree02.in","r",stdin);
BTree T = createTree();
printf("\n前序遍历:");
preOrder(T);
printf("\n中序遍历:");
inOrder(T);
printf("\n后序遍历:");
postOrder(T);
printf("\n层次遍历:");
layOrder(T);
return 0;
}
BTree createTree(){
BTree T = NULL;
char ch;
while(1){
scanf("%c",&ch);
if(ch != '\n' && ch != ' ')
break;
}
if(ch != '#'){
T = (BTree)malloc(sizeof(BNode));
T->lchild = T->rchild = NULL;
T->data = ch;
T->lchild = createTree();
T->rchild = createTree();
}
return T;
}
void visit(BTree T)
{
printf("%c",T->data);
}
void preOrder(BTree T)
{
if(T == NULL)
return;
visit(T);
preOrder(T->lchild);
preOrder(T->rchild);
}
void inOrder(BTree T)
{
if(T == NULL)
return;
inOrder(T->lchild);
visit(T);
inOrder(T->rchild);
}
void postOrder(BTree T)
{
if(T == NULL)
return;
postOrder(T->lchild);
postOrder(T->rchild);
visit(T);
}
void layOrder(BTree T)
{
SqCyQueue q;
init(&q);
push(&q,T);
while(!isEmpty(q)){
pop(&q,&T);
visit(T);
q.front ++;
T = q.front;
visit(T);
if(T->lchild != NULL)
{
q.rear ++;
q.rear = T->lchild;
}
if(T->rchild != NULL)
{
q.rear ++;
q.rear = T->rchild;
}
}
}
void init(SqCyQueue *q)
{
q->front = q->rear = 0;
}
int isEmpty(SqCyQueue q)
{
return q.front == q.rear;
}
int isFull(SqCyQueue q)
{
return (q.rear + 1) % M == q.front;
}
int push(SqCyQueue *q,ElemType item)
{
if(isFull(*q)){
printf("队列已满,入队失败!\n");
return 0;
}
q->data[q->rear] = item;
q->rear = (q->rear + 1) % M;
return 1;
}
int pop(SqCyQueue *q,ElemType *item)
{
if(isEmpty(*q)){
printf("队列为空,出队失败!\n");
return 0;
}
*item = q->data[q->front];
q->front = (q->front + 1) % M;
return 1;
}