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 <stdio.h>
#include <queue>
#include <stack>
#include <vector>
using namespace std;
struct node{
int data;
struct node *lchild,*rchild;
};
vector<int> v;
node* create(int post[],int in[],int l1,int h1,int l2,int h2)
{
node *root=new node();
root->data=post[h1];
int i;
for(i=l2;in[i]!=root->data;i++);
int llen=i-l2;
int rlen=h2-i;
if(llen)
{
root->lchild=create(post, in,l1,l1+llen-1,l2, l2+llen-1);
}else
root->rchild=NULL;
if(rlen)
{
root->rchild=create(post, in,h1-rlen,h1-1,h2-rlen+1, h2);
}else
root->rchild=NULL;
return root;
}
void order(node *root,int n)
{
queue<node*> q;
stack<int> s;
int depth=1;
node *p,*lastnode,*newlastnode;
lastnode = root;
newlastnode=NULL;
if(root == NULL){
return;
}
q.push(root);
while(!q.empty())
{
p=q.front();
q.pop();
if(depth %2 !=0)
{
s.push(p->data);
}else{
while(!s.empty())
{
v.push_back(s.top());
s.pop();
}
v.push_back(p->data);
}
if(p->lchild!=NULL)
{
q.push(p->lchild);
newlastnode=p->lchild;
}
if(p->rchild!=NULL)
{
q.push(p->rchild);
newlastnode=p->rchild;
}
if(p==lastnode)
{
lastnode=newlastnode;
depth++;
}
}
while(!s.empty())
{
v.push_back(s.top());
s.pop();
}
}
int main()
{
int n;
scanf("%d",&n);
int inOrder[n];
int postOrder[n];
for(int i=0;i<n;i++)
{
scanf("%d",&inOrder[i]);
}
for(int i=0;i<n;i++)
{
scanf("%d",&postOrder[i]);
}
node *root = create(postOrder, inOrder, 0, n-1, 0, n-1);
order(root,n);
int size = (int)v.size();
for(int i=0;i<size;i++)
{
printf("%d",v[i]);
if(i!=size-1)
{
printf(" ");
}
}
printf("\n");
return 0;
}