//代码进过测试,直接可以拿来用
//关键就是那一点未透——队列。
// 关键就是一个出队,一个入队操作。
#include<iostream>
#include<stdio.h>
#include<stack>
#include<queue>
#include<malloc.h>
# define MaxSize 100
using namespace std;
//二叉树结点
typedef struct BTNode{
char data;
struct BTNode *lchild;
struct BTNode *rchild;
}BTNode;
//先序建立二叉树,大话p187,教科书吧版
BTNode *CreateBiTree()//只需要一个函数
{
char ch;
BTNode *T;
scanf("%c",&ch);
if(ch=='#')
T=NULL;
else
{
T = (BTNode *)malloc(sizeof(BTNode));
T->data = ch;
T->lchild = CreateBiTree();
T->rchild = CreateBiTree();
}
return T;//返回根节点
}
//底层借助了qu[MaxSize]这个循环数组实现了算法
void LevelOrder(BTNode *T)
{
BTNode *p; //定义工作指针p
BTNode *qu[MaxSize]; //定义环形队列,存放节点指针
int front,rear; //定义队头和队尾指针
front=rear=-1; //置队列为空队列
rear++;
qu[rear]=T; //根节点指针进入队列
while (front!=rear) //队列不为空
{
front=(front+1)%MaxSize;
p=qu[front]; //队头出队列
printf("%c ",p->data); //访问节点
if (p->lchild!=NULL) //有左孩子时将其进队
{
rear=(rear+1)%MaxSize;
qu[rear]=p->lchild;
}
if (p->rchild!=NULL) //有右孩子时将其进队
{
rear=(rear+1)%MaxSize;
qu[rear]=p->rchild;
}
}
}
int main()
{
BTNode *T;
T = CreateBiTree();//建立
LevelOrder(T);
return 0;
}