Suppose that all the keys in a binary tree are distinct positive integers. A unique binary tree can be determined by a given pair of postorder and inorder traversal sequences. And it is a simple standard routine to print the numbers in level-order. However, if you think the problem is too simple, then you are too naive. This time you are supposed to print the numbers in "zigzagging order" -- that is, starting from the root, print the numbers level-by-level, alternating between left to right and right to left. For example, for the following tree you must output: 1 11 5 8 17 12 20 15.
Input Specification:
Each input file contains one test case. For each case, the first line gives a positive integer N (≤30), the total number of nodes in the binary tree. The second line gives the inorder sequence and the third line gives the postorder sequence. All the numbers in a line are separated by a space.
Output Specification:
For each test case, print the zigzagging sequence of the tree in a line. All the numbers in a line must be separated by exactly one space, and there must be no extra space at the end of the line.
Sample Input:
8
12 11 20 17 1 15 8 5
12 20 17 11 15 8 5 1
Sample Output:
1 11 5 8 17 12 20 15
题目大意
题目给出一棵树的中序和后序遍历,要求输出该树的锯齿形遍历(从根所在层开始在左到右和右到左中来回切换)。
解题思路
- 根据中序和后序遍历建树;
- 层序遍历,将元素加入每层的遍历结果,每遍历完一层(到达层尾标记)则根据所在层数决定是否将遍历结果翻转;
- 将每层的遍历结果输出;
- 结束后返回零值。
代码
#include<cstdio>
#define maxn 100
int in[maxn],post[maxn],N,seq;
int temp[maxn],leveln;
struct Node{
int data;
Node *lchild,*rchild;
};
void Init(){
int i;
scanf("%d",&N);
for(i=0;i<N;i++){
scanf("%d",&in[i]);
}
for(i=0;i<N;i++){
scanf("%d",&post[i]);
}
}
Node* newNode(int v){
Node* root=new(Node);
root->data=v;
root->lchild=NULL;
root->rchild=NULL;
return root;
}
Node* Create(int inL,int inR,int postL,int postR){
Node* root;
int k,numL=0;
if(inL>inR){
return NULL;
}
root=newNode(post[postR]);
for(k=inL;k<=inR;k++){
if(in[k]==post[postR]){
break;
}
numL++;
}
root->lchild=Create(inL,k-1,postL,postL+numL-1);
root->rchild=Create(k+1,inR,postL+numL,postR-1);
return root;
}
void Print(){
int i;
for(i=0;i<leveln;i++){
printf("%d",temp[i]);
seq++;
if(seq<N){
printf(" ");
}else{
printf("\n");
}
}
}
void Reverse(int n){
int left=0,right=n-1,t;
while(left<right){
t=temp[left];
temp[left]=temp[right];
temp[right]=t;
left++;
right--;
}
}
void LayerOrder(Node* root){
Node *Queue[maxn];
Node *now;
int level=0;
int front=0,rear=0;
Queue[rear++]=root;
Queue[rear++]=NULL;
while(front<rear){
now=Queue[front++];
if(now==NULL){
level++;
if(level%2){
Reverse(leveln);
}
Print();
leveln=0;
if(front==rear){
break;
}
Queue[rear++]=NULL;
}else{
temp[leveln++]=now->data;
if(now->lchild!=NULL){
Queue[rear++]=now->lchild;
}
if(now->rchild!=NULL){
Queue[rear++]=now->rchild;
}
}
}
}
int main(){
Node* root=NULL;
Init();
root=Create(0,N-1,0,N-1);
LayerOrder(root);
return 0;
}
运行结果