总结:
1.感觉挺简单的,只要思路清晰,写一遍就全ac了,这种题再给我来一打哈哈哈哈
2.掌握层次遍历利用队列----左子树先进队,右子树后进队,主要考察怎么表示一棵树!!
代码:
#include<iostream>
#include<queue>
#include<algorithm>
#include<vector>
using namespace std;
struct node{
int data;
int left;
int right;
int truedata;
};
int n;
vector<node> total1;
vector<int> total2;
queue<node> ps;
queue<node> sk;
int fl = 0;
void dps(int index)
{
if (index <= n - 1 && index >= 0)
{
if(total1[index].left!=-1)dps(total1[index].left);
ps.push(total1[index]);
if (total1[index].right != -1)dps(total1[index].right);
}
}
void level(int index)
{
sk.push(total1[index]);
while (!sk.empty())
{
node k = sk.front();
sk.pop();
cout << k.truedata;
fl++; if (fl != n)cout << " ";
if (total1[k.data].left != -1)sk.push(total1[total1[k.data].left]);
if (total1[k.data].right != -1)sk.push(total1[total1[k.data].right]);
}
}
int main()
{
cin >> n;
total1.resize(n);
total2.resize(n);
for (int i = 0; i < n; i++)
{
int l, r;
cin >> l >> r;
total1[i].data = i;
total1[i].left = l;
total1[i].right = r;
}
for (int i = 0; i < n; i++)
cin >> total2[i];
sort(total2.begin(),total2.end());
dps(0);
for (int i = 0; i < n; i++)
{
node k = ps.front(); ps.pop();
total1[k.data].truedata = total2[i];
}
level(0);
return 0;
}