【剑指offer】面试题23:从上往下打印二叉树
2014-06-16 23:09
519 查看
题目描述:
从上往下打印出二叉树的每个节点,同层节点从左至右打印。
题目解析:
其实就是层序遍历,先遍历完第一层,再遍历完第二层……这时,就要用到数据结构队列:先将根节点入队列,然后出队列,访问节点,将左右子节点入队列,依次循环即可层序访问所有节点。
小的细节:
由于放入队列的是二叉树的节点信息,也就是一个结构体,因此队列要用链表的形式来表示。在二叉树的节点中加入next指针。(不过题目中给的结构体已经确定,是因为在c++中,队列已经建立好,不用构造队列的细节)。为了方便表示空队列,我们需要引入头结点。
完整代码如下:
从上往下打印出二叉树的每个节点,同层节点从左至右打印。
题目解析:
其实就是层序遍历,先遍历完第一层,再遍历完第二层……这时,就要用到数据结构队列:先将根节点入队列,然后出队列,访问节点,将左右子节点入队列,依次循环即可层序访问所有节点。
小的细节:
由于放入队列的是二叉树的节点信息,也就是一个结构体,因此队列要用链表的形式来表示。在二叉树的节点中加入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)); } }
相关文章推荐
- 剑指offer面试题23 从上往下打印二叉树
- 剑指offer 面试题23—从上往下打印二叉树
- 剑指Offer:面试题23 从上往下打印二叉树
- 剑指offer——面试题23:从上往下打印二叉树
- 剑指offer——面试题23:从上往下打印二叉树
- 【剑指offer】面试题23:从上往下打印二叉树
- 【剑指offer 面试题23】从上往下打印二叉树
- 剑指Offer面试题23(Java版):从上往下打印二叉树
- 剑指offer——面试题23:从上往下打印二叉树(树的递归创建,广度优先搜索,队列)
- 【剑指offer】面试题23:从上往下打印二叉树
- 剑指offer-面试题23-从上往下打印二叉树
- 剑指offer-面试题23:从上往下打印二叉树
- 剑指offer面试题[23]-从上往下打印二叉树(按层序打印)
- 【面试题】剑指Offer-23-从上往下打印二叉树
- 【剑指offer】4.3举例让抽象问题具体化——面试题23:从上往下打印二叉树
- 剑指offer--面试题23:从上往下打印二叉树--Java实现
- 剑指Offer----面试题23:从上往下打印二叉树(层序遍历)
- 剑指offer面试题23-从上往下打印二叉树
- 剑指Offer之面试题23:从上往下打印二叉树
- 剑指offer——面试题23:从上往下打印二叉树