您的位置:首页 > 职场人生

【剑指offer】面试题23:从上往下打印二叉树

2014-06-16 23:09 519 查看
题目描述:

从上往下打印出二叉树的每个节点,同层节点从左至右打印。

题目解析:

其实就是层序遍历,先遍历完第一层,再遍历完第二层……这时,就要用到数据结构队列:先将根节点入队列,然后出队列,访问节点,将左右子节点入队列,依次循环即可层序访问所有节点。

小的细节:

由于放入队列的是二叉树的节点信息,也就是一个结构体,因此队列要用链表的形式来表示。在二叉树的节点中加入next指针。(不过题目中给的结构体已经确定,是因为在c++中,队列已经建立好,不用构造队列的细节)。为了方便表示空队列,我们需要引入头结点。

完整代码如下:

#include <stdio.h>
#include <stdlib.h>

#define MAXSIZE 100

typedef struct BiTNode{
int data;
struct BiTNode *lchild,*rchild;
struct BiTNode *next;   //为了在队列里面应用
}BiTNode,*BiTree;

typedef struct{
BiTNode *front,*rear;
}SQueue;

void LevelOrderTraverse(BiTree *T,SQueue *Q);
void InitQueue(SQueue *Q);
void CreateBiTree(BiTree *T);
int EnQueue(SQueue *Q,BiTree *T);
int DeQueue(SQueue *Q,BiTree *T);
int Empty(SQueue Q);

int main(void)
{
int n;

SQueue queue;
BiTree head;
printf("input n to continue:");
while(scanf("%d",&n) == 1){
InitQueue(&queue);
CreateBiTree(&head);
LevelOrderTraverse(&head,&queue);

printf("\ninput n to continue:");
}

return 0;
}

void InitQueue(SQueue *Q)
{
Q->front = Q->rear = (BiTNode *)malloc(sizeof(BiTNode));
if(!Q->front)
exit(-1);
}

void CreateBiTree(BiTree *T)
{
int data;

scanf("%d",&data);
if(data == 0){
*T = NULL;
}else{
*T = (BiTNode *)malloc(sizeof(BiTNode));
if(!*T)
exit(-1);
(*T)->data = data;
CreateBiTree(&((*T)->lchild));
CreateBiTree(&((*T)->rchild));
}
}

int EnQueue(SQueue *Q,BiTree *T)
{
if(*T){
Q->rear->next = *T;
(*T)->next = NULL;
Q->rear = *T;
return 1;
}
return 0;
}

int DeQueue(SQueue *Q,BiTree *T)
{
if(Q->rear == Q->front)
return 0;
*T = Q->front->next;

if(Q->front->next == Q->rear)   //注意处理队列为空时的情况
Q->rear = Q->front;
Q->front->next = (*T)->next;
return 1;
}

int Empty(SQueue Q)
{
if(Q.front == Q.rear)
return 1;
return 0;

}

void LevelOrderTraverse(BiTree *T,SQueue *Q)
{
BiTree p;
if(!T)
return ;
EnQueue(Q,T);   //先将根节点入队列,然后出队列的时候再打印节点信息

while(!Empty(*Q)){
DeQueue(Q,&p);
printf("%d ",p->data);
EnQueue(Q,&(p->lchild));
EnQueue(Q,&(p->rchild));
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: