#include <stdio.h>
#include <stdlib.h>
#define ERROR 0
#define OK 1
typedef char TElemType;
typedef int Status;
//二叉树的二叉链表存储表示
typedef struct BiTNode
{
TElemType data;
struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;
//定义链式队列结点
typedef struct QNode
{
BiTree Queuedata;
struct QNode * next;
}QNode,* QueuePtr;
//定义链式队列
typedef struct
{
QueuePtr front;
QueuePtr rear;
}LinkQueue;
//按照先序次序构造二叉树
Status CreatBiTree(BiTree &T)
{char ch;
scanf("%c",&ch);
if(ch=='#') T=NULL;
else
{
if(!(T=(BiTNode *)malloc(sizeof(BiTNode))))
return ERROR;
T->data=ch;
CreatBiTree(T->lchild);
CreatBiTree(T->rchild);
}
return OK;
}
//递归先序遍历二叉树
Status PreOrder ( BiTree T )
{
if ( T!=NULL)
{
printf("%c",T->data);
PreOrder ( T->lchild );
PreOrder ( T->rchild );
}
return OK;
}
//递归中序遍历二叉树
Status InOrder ( BiTree T )
{
if ( T!=NULL)
{
InOrder ( T->lchild );
printf("%c",T->data);
InOrder ( T->rchild );
}
return OK;
}
//递归后序遍历二叉树
Status LastOrder ( BiTree T )
{
if (T!=NULL)
{
LastOrder( T->lchild );
LastOrder( T->rchild );
printf("%c",T->data);
}
return OK;
}
//初始化一个带头结点的队列
Status InitQueue(LinkQueue &Q)
{
Q.front=(QNode*)malloc(sizeof(QNode));
if (!Q.front)
return ERROR;
Q.rear=Q.front;
Q.front->next=NULL;
return OK;
}
//入队列
Status EnQueue(LinkQueue &Q,BiTree e)
{
QueuePtr s=(QueuePtr)malloc(sizeof(QNode));
if (!s)
return ERROR;
s->Queuedata=e;
s->next=NULL;
Q.rear->next=s;
Q.rear=s;
return OK;
}
//出队
int DelQueue(LinkQueue &Q, BiTree &e)
{
char data1;
QueuePtr s;
s=Q.front->next;
e=s->Queuedata;
data1=e->data;
Q.front->next=s->next;
if(Q.rear==s)
Q.rear=Q.front;
free(s);
return OK;
}
//队列的判断空操作
Status QueueEmpty(LinkQueue Q)
{
if (Q.front->next==NULL)
return OK;
else return ERROR;
}
//按层次遍历
Status LevelBiTree(BiTree T)
{
LinkQueue Q;
InitQueue(Q);
BiTree p = T;
if (T == NULL) return ERROR;
EnQueue(Q,p);
while (!QueueEmpty(Q))
{ DelQueue(Q, p);
printf("%C",p->data);
if (p->lchild)
EnQueue(Q, p->lchild);
if (p->rchild)
EnQueue(Q, p->rchild);
}
return OK;
}
int main()
{BiTree T;
printf("按照先序次序输入二叉树中结点的值.\n");
CreatBiTree(T);
printf("先序遍历二叉树:");
PreOrder(T);printf("\n");
printf("中序遍历二叉树:");
InOrder(T);printf("\n");
printf("后序遍历二叉树:");
LastOrder(T);printf("\n");
printf("按层次遍历二叉树:");
LevelBiTree(T);printf("\n");
return 0;
}