-
题目描述:
-
从上往下打印出二叉树的每个节点,同层节点从左至右打印。
-
输入:
-
输入可能包含多个测试样例,输入以EOF结束。
对于每个测试案例,输入的第一行一个整数n(1<=n<=1000, :n代表将要输入的二叉树元素的个数(节点从1开始编号)。接下来一行有n个数字,代表第i个二叉树节点的元素的值。接下来有n行,每行有一个字母Ci。
Ci=’d’表示第i个节点有两子孩子,紧接着是左孩子编号和右孩子编号。
Ci=’l’表示第i个节点有一个左孩子,紧接着是左孩子的编号。
Ci=’r’表示第i个节点有一个右孩子,紧接着是右孩子的编号。
Ci=’z’表示第i个节点没有子孩子。
-
输出:
-
对应每个测试案例,
按照从上之下,从左至右打印出二叉树节点的值。
-
样例输入:
-
7 8 6 5 7 10 9 11 d 2 5 d 3 4 z z d 6 7 z z
-
样例输出:
-
8 6 10 5 7 9 11
-
结果:#include<stdio.h> #include<stdlib.h> struct BTNode { int data; int rchild; int lchild; }; struct Node { struct BTNode data; struct Node* pNext; }; struct Queue { struct Node* front;//队列头指针 struct Node* rear; //队列尾指针 }; //创建一个空队列 Queue* createQueue() { Queue* queue= (Queue*)malloc(sizeof(Queue)); queue->front=(Node*)malloc(sizeof(Node)); if(!queue||!queue->front) { printf("queue or front malloc faild"); exit(-1); } else { queue->rear=queue->front;//队列头指针和尾指针指向一起 queue->front-> pNext=NULL; } return queue; } bool isEmpty(Queue* queue) { if(queue->front==queue->rear) return true; else return false; } //进队列操作 void enQueue(Queue* queue,BTNode e) { Node* pNew= (Node*)malloc(sizeof(Node*)); if(!pNew) { printf("pNew malloc failed"); exit(-1); } else { pNew->data=e; pNew->pNext=NULL; queue->rear->pNext=pNew; queue->rear=pNew; } } bool deQueue(Queue* queue,BTNode* pData) { if(isEmpty(queue)){ return false; } else { Node* p = queue->front->pNext; *pData=p->data; queue->front->pNext=p->pNext; if(queue->rear==p) queue->rear=queue->front; //free(p); } return true; } void destroyQueue(Queue* queue) { if(isEmpty(queue)) return; else { while(queue->front) { queue->rear=queue->front->pNext; free(queue->front); queue->front=queue->rear; } } //free(queue); queue=0; return; } void levelTraverse(BTNode* pTree,int index,int * levelTra,int n) { if(pTree==NULL) return ; if(index==-1) return; BTNode pBTNode; Queue * queue=createQueue(); enQueue(queue,pTree[0]); int i=0; while(!isEmpty(queue)&&i<n) { deQueue(queue,&pBTNode); levelTra[i++]=pBTNode.data; if(pBTNode.lchild!=-1) enQueue(queue,pTree[pBTNode.lchild]); if(pBTNode.rchild!=-1) enQueue(queue,pTree[pBTNode.rchild]); } destroyQueue(queue); } int main() { int n; while(scanf("%d",&n)!=EOF) { BTNode *pTree=NULL; if(n>0) { pTree=(BTNode*)malloc(n*sizeof(BTNode)); if(pTree==NULL) exit(-1); int i,data; for(i=0;i<n;i++) { scanf("%d",&data); pTree[i].data=data; pTree[i].rchild=-1; pTree[i].lchild=-1; } for(i=0;i<n;i++) { char ch; while(getchar()!='\n') continue; scanf("%c",&ch); if(ch=='z') continue; else if(ch=='l') { int lindex; scanf("%d",&lindex); pTree[i].lchild=lindex-1; } else if(ch=='r') { int rindex; scanf("%d",&rindex); pTree[i].rchild=rindex-1; } else if(ch=='d') { int lindex,rindex; scanf("%d",&lindex); scanf("%d",&rindex); pTree[i].lchild=lindex-1; pTree[i].rchild=rindex-1; } } } int levelTra[n]; levelTraverse(pTree,0,levelTra,n); int i; for(i=0;i<n;i++) { if(i==n-1) printf("%d\n",levelTra[i]); else printf("%d",levelTra[i]); } free(pTree); pTree=NULL; } return 0; }