#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<string.h>
#include<cmath>
using namespace std;
//65min
//耗时于编码,改bug,改思路
/*************************
题意:
给出中序后序遍历序列,求“之”字形序列。
即先左方向输出,再右方向输出。
*************************/
/************************
求解要点:
1.树的构建。先看输入要求,判断能否用数组树,否则用指针树。
2.建议把pl,pr,il,ir写成pL,pR,iL,iR,避免混淆l和r。
3.之字形输出,先观察,思考,再写,别写个方法结果是错的!
这里显然在BFS中设置各点的level层数,不同层存入不同的数组
最后数组输出时,根据level的奇或偶判断向左还是向右
************************/
/***********************
笔记:
*********************/
#define M 120000
#define INF 0xffffff
int in[M],post[M];
vector<int> ans[500];
struct Node
{
int data;
struct Node *Left,*Right;
int level;
};
;struct Node *buildtree(int il,int ir,int pl,int pr)
{
int i;
//printf("%d %d %d %d\n",il,ir,pl,pr);
if(il>ir || pl>pr)
return NULL;
struct Node *root;
root=(struct Node*)malloc(sizeof(Node));
root->data=post[pr];
for(i=il;i<=ir;i++)
if(root->data==in[i])
break;
root->Left=buildtree(il,i-1,pl,pl+i-il-1);
root->Right=buildtree(i+1,ir,pl+i-il,pr-1);
return root;
}
void zigput(Node *root)
{
queue<Node *> q;
struct Node *node;
node=root;
node->level=1;
q.push(node);
int maxlevel;
while(!q.empty())
{
node = q.front();
q.pop();
ans[node->level].push_back(node->data);
maxlevel=node->level;
if(node->Left!=NULL)
{
node->Left->level=node->level+1;
q.push(node->Left);
}
if(node->Right!=NULL)
{
node->Right->level=node->level+1;
q.push(node->Right);
}
}
int i,j;
cout<<ans[1][0];
for(i=2;i<=maxlevel;i++)
{
if(i%2==0)
{
for(j=0;j<ans[i].size();j++)
printf(" %d",ans[i][j]);
}
else
for(j=ans[i].size()-1;j>=0;j--)
printf(" %d",ans[i][j]);
}
cout<<endl;
}
int main()
{
int n,i,j;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&in[i]);
for(i=0;i<n;i++)
scanf("%d",&post[i]);
Node *root = (Node *)malloc(sizeof(Node));
root=buildtree(0,n-1,0,n-1);
zigput(root);
}
PAT 1127. ZigZagging on a Tree (30) 树的构建+特殊遍历序列
最新推荐文章于 2022-11-20 17:40:31 发布