PAT 1127. ZigZagging on a Tree (30) 树的构建+特殊遍历序列

来源:互联网 发布:mac后台程序关不上 编辑:程序博客网 时间:2024/06/14 15:10
#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 0xffffffint 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);}