The number of points that are preprocessed for each node left subtree.
Then make sure it's worth the time to go.
#include <cstdio>#include<cstring>#include<cmath>#include<vector>#include<map>#include<queue>#include<stack>#include<algorithm>using namespacestd;structnode{intVal; intLeft ; intRight ; intNUML,NUMR;} s[ $];intn,a[ $];vector<int>ans;voidDfsintx) { 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; }}voidFind (intXintLintR) {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);}voidBFs () {Queue<int>P; Q.push (0); while(!Q.empty ()) { intH=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); }}intMain () {scanf ("%d",&N); for(intI=0; i<n;i++) {scanf ("%d%d",&s[i].left,&s[i].right); S[I].NUML=s[i].numr=0; } for(intI=1; i<=n;i++) scanf ("%d",&A[i]); Sort (a+1, A +1+N); DFS (0); Find (0,1, N); BFS (); for(intI=0; I<ans.size (); i++) {printf ("%d", Ans[i]); if(I<ans.size ()-1) printf (" "); Elseprintf"\ n"); } return 0;}
PAT (Advanced level) 1099. Build A Binary Search Tree (30)