1 11 5 8 17 12 20 15
题意就是要按照给定的中序遍历和后续遍历顺序输出树的蛇形遍历序列
我们可以先还原出树 然后在把树dfs一遍 推出每层的节点有多少 记录下来 在用一个bfs搞出层序遍历存到vector里
然后再根据每层的节点数 把vector里响应的元素reverse!
CODE:
#include<bits/stdc++.h>#include<vector>using namespace std;int in[35];int post[35];int flo[30];typedef struct node{ int key; node *l,*r; node(int k):key(k),l(NULL),r(NULL){}}NN,*NNN;NNN devide(int l,int r,int pl,int pr){ int i,k=post[pr],left,right; for(i=l;in[i]!=k&&i<=r;i++);//lack ; left = i-l; right = r-i; NNN p = (NNN)malloc(sizeof(NN)); p->key=k;p->l=p->r=NULL; if(right!=0)p->r=devide(i+1,r,pr-right,pr-1); if(left!=0)p->l=devide(l,i-1,pl,pr-right-1); return p;}void preorder(NNN p){ if(p) { printf("%d ",p->key); preorder(p->l); preorder(p->r); }}int flor;void dfs(NNN rt,int f){ if(rt) { flo[f]++; dfs(rt->l,f+1); dfs(rt->r,f+1); flor=max(flor,f); }}vector<int>res;void bfs(NNN rt){ queue<NNN>q; q.push(rt); while(q.size()) { NNN a = q.front();q.pop(); int t = a->key; res.push_back(t); if(a->l!=NULL)q.push(a->l); if(a->r!=NULL)q.push(a->r); }} int main(){ int n; cin>>n; for(int i=1;i<=n;i++)scanf("%d",&in[i]); for(int i=1;i<=n;i++)scanf("%d",&post[i]); NNN rt; rt=devide(1,n,1,n); dfs(rt,1); bfs(rt); int sum=0; vector<int>::iterator ss; vector<int>::iterator ee; for(int i=1;i<=flor;i++) { if(i%2==1) { ss=res.begin(); for(int j=0;j<sum;j++,ss++); ee=ss; for(int j=0;j<flo[i];j++,ee++); reverse(ss,ee); } sum+=flo[i]; } for(int i=0;i<n;i++) { cout<<res[i]; if(i==n-1)cout<<endl; else cout<<" "; } return 0;}
新闻热点
疑难解答