#include<iostream>
#include<queue>
#include<algorithm>
using namespace std;
int lef[100]={0};
int righ[100]={0};
int value[100]={0};
int q[100]={0};
int k;
bool compare(int a,int b)
{
return a<b;
}
int dg(int root)
{
if(lef[root]==-1)
{
q[root]=value[k++];
if(righ[root]!=-1)
{
dg(righ[root]);
}
else
{
return 0;
}
}
else
{
dg(lef[root]);
q[root]=value[k++];
if(righ[root]!=-1)
{
dg(righ[root]);
}
}
}
int main()
{
int n=0;
while(scanf("%d",&n)!=EOF)
{
for(int i=0;i<n;i++)
{
scanf("%d %d",&lef[i],&righ[i]);
}
for(int i=0;i<n;i++)
{
scanf("%d",&value[i]);
}
sort(value,value+n,compare);
k=0;
dg(0);
printf("%d",q[0]);
queue<int> qq;
qq.push(0);
int j=0;
while(!qq.empty())
{
j=qq.front();
qq.pop();
if(lef[j]!=-1)
{
qq.push(lef[j]);
}
if(righ[j]!=-1)
qq.push(righ[j]);
if(j!=0)printf(" %d",q[j]);
}
}
return 0;
}
思路:首先使用两个数组分别表达左右子树
然后从小到大排列输入数组,为中序遍历做准备
然后使用递归使用中序遍历顺序构建树(这里应该可以用栈,就不递归了)
使用队列进行层序遍历输出结果