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

来源:互联网 发布:足球赌球什么软件 编辑:程序博客网 时间:2024/05/16 07:39


题目描述:

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



题目解析:

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


小的细节:

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


完整代码如下:

#include <stdio.h>#include <stdlib.h>#define MAXSIZE 100typedef 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));    }}





0 0