预处理每个节点左子树有多少个点。
然后确定值得时候递归下去就可以了。
#include<cstdio> #include<cstring> #include<cmath> #include<vector> #include<map> #include<queue> #include<stack> #include<algorithm> using namespace std; struct Node { int val; int left; int right; int numL,numR; }s[200]; int n,a[200]; vector<int>ans; void dfs(int x) { if(s[x].left!=-1) { dfs(s[x].left); s[x].numL=s[s[x].left].numL+s[s[x].left].numR+1; } if(s[x].right!=-1) { dfs(s[x].right); s[x].numR=s[s[x].right].numL+s[s[x].right].numR+1; } } void Find(int x,int L,int R) { s[x].val=a[L+s[x].numL]; if(s[x].left!=-1) Find(s[x].left,L,L+s[x].numL-1); if(s[x].right!=-1) Find(s[x].right,L+s[x].numL+1,R); } void bfs() { queue<int>q; q.push(0); while(!q.empty()) { int h=q.front(); q.pop(); ans.push_back(s[h].val); if(s[h].left!=-1) q.push(s[h].left); if(s[h].right!=-1) q.push(s[h].right); } } int main() { scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%d%d",&s[i].left,&s[i].right); s[i].numL=s[i].numR=0; } for(int i=1;i<=n;i++) scanf("%d",&a[i]); sort(a+1,a+1+n); dfs(0); Find(0,1,n); bfs(); for(int i=0;i<ans.size();i++) { printf("%d",ans[i]); if(i<ans.size()-1) printf(" "); else printf("\n"); } return 0; }
时间: 2024-10-10 02:45:35