题目 二叉树 中序和后序还原
题目描述
https://www.acwing.com/problem/content/1499/
代码
#include <cstdio> #include <iostream> #include <cstring> #include <algorithm> #include <queue> using namespace std; #define ll long long
int postorder[10010]; int inorder[10010]; int postpos[10010]; int inpos[10010]; int l[10010]; int r[10010]; int n;
int root;
void build(int il,int ir,int rt){ int inrtpos=inpos[rt]; int postrtpos=postpos[rt];
int rsize=ir-inrtpos; if(rsize>0){ r[rt]=postorder[postrtpos-1]; build(inrtpos+1,ir,r[rt]); } int lsize=inrtpos-il; if(lsize>0){ l[rt]=postorder[postrtpos-rsize-1]; build(il,inrtpos-1,l[rt]); } return ; }
void bfs(int root){ queue<int> q; q.push(root); while(!q.empty()){ int cur=q.front() ; q.pop(); printf("%d ",cur); if(l[cur]){ q.push(l[cur]); } if(r[cur]){ q.push(r[cur] ); } } return ; }
int main(){ cin>>n; for(int i=1;i<=n;i++){ scanf("%d",&postorder[i]); postpos[postorder[i]]=i; } for(int i=1;i<=n;i++){ scanf("%d",&inorder[i]); inpos[inorder[i]]=i; } root=postorder[n]; build(1,n,root); bfs(root); return 0; }
|