输入样例:
a b c d f g i 0 0 e 0 0 h 0 0 0 0 0 0
输出样例:
a b c d f g i e h
#include <stdio.h>
#include <stdlib.h>
#define NoInfo '0'
int MaxSize =100;
typedef struct TNode* Position;
typedef char ElementType;
typedef struct TNode* BinTree;
struct TNode{
ElementType Data;
BinTree Left;
BinTree Right;
};
struct QNode{
BinTree* Data;
ElementType front,rear;
int MaxSize;
};
typedef struct QNode* Queue;
Queue CreatQueue(){
Queue Q=(Queue)malloc(sizeof(struct QNode));
Q->Data=(BinTree*)malloc(sizeof(BinTree)*MaxSize);
Q->front=Q->rear=-1;
Q->MaxSize=MaxSize;
return Q;
}
int IsEmpty(Queue Q){
return (Q->front==Q->rear);
}
int IsFull(Queue Q){
return ((Q->rear+1)%Q->MaxSize==Q->front);
}
bool AddQ(Queue Q,BinTree BT){
if(IsFull(Q)){
printf("Queue if full");
return false;
}
else{
Q->rear=(Q->rear+1)%Q->MaxSize;
Q->Data[Q->rear]=BT;
return true;
}
}
BinTree Delete(Queue Q){
if(IsEmpty(Q)){
printf("Queue is empty");
return NULL;
}
else{
Q->front=(Q->front+1)%Q->MaxSize;
return Q->Data[Q->front];
}
}
BinTree CreateTree(){ //层序生成二叉树
ElementType Data;
BinTree BT,T;
Queue Q=CreatQueue();
scanf("%c",&Data);
getchar();
if(Data !=NoInfo){
BT=(BinTree)malloc(sizeof(struct TNode));
BT->Data=Data;
BT->Left=BT->Right=NULL;
AddQ(Q,BT);
}
else return NULL;
while(!IsEmpty(Q)){
T=Delete(Q);
scanf("%c",&Data);
getchar();
if(Data ==NoInfo)
T->Left=NULL;
else{
T->Left=(BinTree)malloc(sizeof(struct TNode));
T->Left->Data=Data;
T->Left->Left=T->Left->Right=NULL;
AddQ(Q,T->Left);
}
scanf("%c",&Data);
getchar();
if(Data==NoInfo)
T->Right=NULL;
else{
T->Right=(BinTree)malloc(sizeof(struct TNode));
T->Right->Data=Data;
T->Right->Left=T->Right->Right=NULL;
AddQ(Q,T->Right);
}
}
return BT;
}
void LevelorderTraversal(BinTree BT){
Queue Q;
BinTree T;
if(!BT) return;
Q=CreatQueue();
AddQ(Q,BT);
int flag=1;
while(!IsEmpty(Q)){
T=Delete(Q);
if(flag) flag=0;
else printf(" ");
printf("%c",T->Data);
if(T->Left) AddQ(Q,T->Left);
if(T->Right) AddQ(Q,T->Right);
}
}
int main(){
BinTree BT=CreateTree();
LevelorderTraversal(BT);
return 0;
}