1 题目描述
从上往下打印出二叉树的每个结点,同一层的结点按照从左到右的顺序打印。
2 解法描述
每一次打印一个结点的时候,如果该节点有子结点,那么把该节点的子结点放到一个队列的末尾。接下来从队列的头部取出最早进入队列的结点,重复前面的打印操作,直到队列中的所有结点都被打印出来为止。
3 C语言实现
#include<stdio.h>
// Tree
typedef char ElemType;
typedef struct node{
ElemType data;
struct node *lchild,*rchild;
}TNode,*Tree;
typedef struct node1{
TNode* data;
struct node1 *next;
}SNode,QNode,*Stack;
// Queue
typedef struct node2{
QNode *front,*rear;
}QueueNode,*Queue;
//初始化队列
void initQueue(Queue *queue){
QNode* header=(QNode*)malloc(sizeof(QNode));
header->data=NULL;
header->next=NULL;
(*queue)=(QueueNode*)malloc(sizeof(QueueNode));
//设立头结点
(*queue)->front=header;
(*queue)->rear=header;
}
//入队
void enQueue(Queue queue,TNode* data){
if(queue==NULL) return;
QNode *enqueue=(QNode*)malloc(sizeof(QNode));
enqueue->data=data;
enqueue->next=NULL;
queue->rear->next=enqueue;
queue->rear=enqueue;
}
//出队
void deQueue(Queue queue,TNode** dequeueVlaue){
if(isQueueEmpty(queue)) return;
QNode* dequeue=queue->front->next;
*dequeueVlaue=dequeue->data;
queue->front->next=dequeue->next;
//如果只有一个元素
if(dequeue==queue->rear){
queue->rear=queue->front;
}
free(dequeue);
}
//队列是否为空
int isQueueEmpty(Queue queue){
return queue==NULL||queue->front==queue->rear?1:0;
}
//创建二叉树
TNode* createTree(){
ElemType data;
scanf("%c",&data);
TNode* node;
if(data=='0') return NULL;
node=(TNode*)malloc(sizeof(TNode));
node->data=data;
node->lchild=createTree();
node->rchild=createTree();
return node;
}
//层次遍历
void levelOrder(Tree tree){
Queue queue;
queue=NULL;
initQueue(&queue);
TNode* temp=NULL;
if(tree==NULL) return;
enQueue(queue,tree);
while(!isQueueEmpty(queue)){
deQueue(queue,&temp);
printf("%c",temp->data);
if(temp->lchild!=NULL){
enQueue(queue,temp->lchild);
}
if(temp->rchild!=NULL){
enQueue(queue,temp->rchild);
}
}
}
void main(){
Tree tree;
tree=NULL;
printf("%s:","请输入二叉树的元素");
tree=createTree();
printf("\n%s:","层次遍历结果");
levelOrder(tree);
}