#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
struct node{
int data,index,l,r,level;
}a[109];
int b[102];
vector<node>ans;
int cnt=0;
void dfs(int root,int index,int level)
{
if(a[root].l!=-1) dfs(a[root].l,2*index+1,level+1);
//声明了l r没用上
ans.push_back({b[cnt++],index,0,0,level});
//r 搞成了l人裂开一步步来写清楚,一个符号疏忽就会投入很多的时间成本(注意)
if(a[root].r!=-1) dfs(a[root].r,2*index+2,level+1);
}
bool cmp(node a,node b)
{ if(a.level!=b.level) return a.level<b.level;
else return a.index<b.index;
}
int main()
{ int n;
cin>>n;
for(int i=0;i<n;i++)
{ int l,r;
cin>>l>>r;
a[i].l=l;
a[i].r=r;
}
for(int i=0;i<n;i++)
cin>>b[i];
sort(b,b+n);
dfs(0,0,0);
sort(ans.begin(),ans.end(),cmp);
printf("%d",ans[0].data);
for(int i=1;i<n;i++)
printf(" %d",ans[i].data);
return 0;
}
总结:
1.疏忽将r打成了l,一步步来,想清楚,否则会付出更大的时间成本
2.弄得结构体,一定要看清楚往里面传值的位置不要写错
3.程序遍历使用dfs建树(结点)后设置层次以及重新标号参数可以直接用sort输出层序遍历
4.一堆无序的数据从小到大排起来,即得到中序遍历的序列,一开始这堆数据位置是混乱的,可以利用排序后的序列利用dfs建树
英语:
问题:
前面的dfs那些条件需要再重新练一下练一下正确的思维与反应