目的:z字形输出
输入:
中序和后序遍历顺序
输出:
层序遍历,按照Z字型输出
算法:建树,再广度搜索把节点存下来。奇数层的从后往前输出,偶数层从前往后输出。
#include<stdio.h>
#include<queue>
#include<vector>
using namespace std;
struct node{
int value;
int layer;
node* left,*right;
}* root;
vector<int> inorder,postorder;
vector<node*> ans;
int N;
void creat(node*& now,int num,int il,int ir,int pl,int pr)
{
if(il>ir) return;
now = new node;
now->value = postorder[pr];
now->layer = num;
now->left = NULL;
now->right=NULL;
int k=il;
while(inorder[k]!=postorder[pr]) k++;
int numleft = k-il;
creat(now->left,num+1,il,il+numleft-1,pl,pl+numleft-1);
creat(now->right,num+1,k+1,ir,pl+numleft,pr-1);
}
void leveltravel(node* r)
{
queue<node*> q;
q.push(r);
while(q.size()!=0)
{
node* top = q.front();
ans.push_back(top);
q.pop();
if(top->left!=NULL) q.push(top->left);
if(top->right!=NULL) q.push(top->right);
}
}
int main()
{
scanf("%d",&N);
inorder.resize(N);
postorder.resize(N);
for(int i=0;i<N;i++)
{
scanf("%d",&inorder[i]);
}
for(int i=0;i<N;i++)
{
scanf("%d",&postorder[i]);
}
creat(root,1,0,N-1,0,N-1);
leveltravel(root);
for(int i=0;i<ans.size();)
{
node* now = ans[i];
if(now->layer%2==0)
{
printf("%d",now->value);
i++;
}else
{
int k = i;
while(k<ans.size()&&ans[k]->layer==now->layer) k++;
for(int j=k-1;j>=i;j--)
{
printf("%d",ans[j]->value);
if(j!=i)
printf(" ");
}
i = k;
}
if(i!=ans.size())
printf(" ");
else
printf("\n");
}
return 0;
}
反思:
存节点的时候想到用vector,没有想到用vector数组。那样最后输出数据会简单得多。