#include<stdio.h>
#include<stdlib.h>
//层序遍历,使用队列进行操作,链队列
//将根节点入队,执行循环:结点出队,访问该节点,其左右儿子入队
typedef char TElemType;
typedef int Status;
#define MAXSIZE 100
#define OK 1
#define ERROR 0
#define OVERFLOW -1
#define TRUE 1
#define FALSE 0
typedef struct BiNode//二叉树
{
TElemType data;
struct BiNode *lchild,*rchild;
} BiNode,*BiTree;
typedef struct QueueNode//链队列结点
{
BiTree data;
struct QueueNode *next;
} QueueNode,*pQueueNode;
typedef struct Queue//链队列
{
pQueueNode front;
pQueueNode rear;
} Queue,*pQueue;
Status CreatTree(BiTree &T)//建立一棵树
{
TElemType ch;
scanf("%c",&ch);
if(ch=='*')
T=NULL;
else
{
T=(BiTree)malloc(sizeof(BiNode));
if(!T)
exit(OVERFLOW);
T->data=ch;
CreatTree(T->lchild);
CreatTree(T->rchild);
}
return OK;
}
pQueue InitQueue(pQueue Q)//建立队列,返回队列的首结点
{
Q->front=(pQueueNode)malloc(sizeof(QueueNode));
Q->front->next=NULL;
Q->rear=Q->front;
return Q;
}
void EnQueue(pQueue Q,BiTree t)//树的结点入队
{
pQueueNode pNew=(pQueueNode)malloc(sizeof(QueueNode));
pNew->data=t;
pNew->next=NULL;
Q->rear->next=pNew;
Q->rear=pNew;
}
BiTree DeQueue(pQueue Q)//出队列,返回结点的值
{
BiTree x;
pQueueNode pTemp;//=(pQueueNode)malloc(sizeof(QueueNode));
pTemp=Q->front->next;
x=pTemp->data;
Q->front->next=pTemp->next;
if(Q->rear==pTemp)//只有一个元素
Q->rear=Q->front;
free(pTemp);
return x;
}
Status QueueEmpty(pQueue Q)//判断队列是否为空
{
if(Q->front->next==NULL)
return TRUE;
else
return FALSE;
}
int LevelOrder(BiTree T)
{
pQueue Q=(pQueue)malloc(sizeof(Queue));//!!!!
BiTree root;
if(!T)//空树直接返回
return 0;
Q=InitQueue(Q);//建立队列;
//将根结点入队
EnQueue(Q,T);
while(!QueueEmpty(Q))//如果队列不为空
{
root=DeQueue(Q);//从队列中取出一个元素,访问它
printf("%c",root->data);
if(root->lchild)//左孩子不为空,入队
EnQueue(Q,root->lchild);
if(root->rchild)//右孩子不为空,入队
EnQueue(Q,root->rchild);
}
}
int main()
{
BiTree T;
CreatTree(T);
LevelOrder(T);
return 0;
}
07-10
6494
07-20
3302
11-09
1160