输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印。
例如输入
8
/ \
6 10
/ \ / \
5 7 9 11
例如输入
8
/ \
6 10
/ \ / \
5 7 9 11
输出8 6 10 5 7 9 11。
#include "stdlib.h"
#include "stdio.h"
typedef struct BTNode
{
int data;
struct BTNode *lnode;
struct BTNode *rnode;
}BTNode;
BTNode *CreateTree(int pre[], int in[], int l1, int r1, int l2, int r2){
BTNode *s;
int i;
if(l1 > r1)
return NULL;
s = (BTNode *)malloc(sizeof(BTNode));
s->lnode = s->rnode = NULL;
for(i=l2; i<=r2; ++i){
if(pre[l1] == in[i]){
break;
}
}
s->data = in[i];
s->lnode = CreateTree(pre, in, l1+1, l1+i-l2, l2, i-1);
s->rnode = CreateTree(pre, in, l1+i-l2+1, r1, i+1, r2);
return s;
}
void PrePrint(BTNode *p){
if(p != NULL){
printf("%d ", p->data);
PrePrint(p->lnode);
PrePrint(p->rnode);
}
}
void InPrint(BTNode *p){
if(p != NULL){
InPrint(p->lnode);
printf("%d ", p->data);
InPrint(p->rnode);
}
}
void LevelTraverse(BTNode *p){
int maxSize = 50;
BTNode *queue[50];
int front, rear;
front = rear = 0;
if(p != NULL){
//Get in queue
rear = (rear+1)%maxSize;
queue[rear] = p;
//The queue is not empty
while(front != rear){
// Get out queue
front = (front+1)%maxSize;
p = queue[front];
//Visit queue
printf("%d ", p->data);
if(p->lnode != NULL){
//Get in queue
rear = (rear+1)%maxSize;
queue[rear] = p->lnode;
}
if(p->rnode != NULL){
//Get in queue
rear = (rear+1)%maxSize;
queue[rear] = p->rnode;
}
}
}
}
void main(){
int pre[] = {10, 5, 4, 7, 12, 8, 11, 6};
int in[] = {4, 5, 12, 7, 10, 11, 8, 6};
BTNode *p;
p = CreateTree(pre, in, 0, 7, 0, 7);
LevelTraverse(p);
putchar('\n');
PrePrint(p);
}