1.刚开始想的是构造树的时候,顺便存储每层的值,但是 有两个例子段错误
2.之后就只好按构造的树来进行层次遍历
3.题目理解错了,以为没告诉你两个节点的父节点,所以是一直递归,直到不能递归来构造树。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<vector>
#include<algorithm>
using namespace std;
const int N = 200000+5;
struct Node {
int l, r;
int data;
} T[N];
int D[N], L[N], R[N], level[N];
vector<int> ans;
int cnt = 0, idx=0;
void CreateT(int r, int IDX) {
int a=L[r], b=R[r];
if(r == -1)return;
// cin >> a >> b;
T[r].l = a;
T[r].r = b;
if(a!=-1)idx++;
CreateT(a, IDX<<1);
T[r].data = D[cnt++];
level[IDX] = T[r].data;
// cout<<IDX << "层次遍历:" << level[IDX] << endl;
// cout << r << "对应的数: "<< D[cnt-1] << endl;
if(b!=-1)idx++;
CreateT(b, IDX<<1|1);
}
void Level(){
queue<int> q;
q.push(0);
while(!q.empty()){
int tmp = q.front();
q.pop();
if(tmp == -1) continue;
ans.push_back(T[tmp].data);
q.push(T[tmp].l);
q.push(T[tmp].r);
}
}
int main() {
int n;
cin >> n;
for(int i=0; i<n; i++) {
cin >> L[i] >> R[i];
}
for(int i=0; i<n; i++) {
cin >> D[i];
}
sort(D, D+n);
CreateT(0, 1);
/*//中序遍历的结果
for(int i=0; i<n-1; i++) {
cout << T[i].data << " ";
}
cout << T[n-1].data << endl;*/
int cnt = 0, i=0;
Level();
/* while(cnt<n) {//有两个段错误 初步估计是空间问题
if(level[i]) {
if(cnt == n-1)
cout << level[i] << endl;
else
cout << level[i] << " ";
cnt++;
}
i++;
}
*/
for(i=0; i<ans.size()-1; i++){
cout << ans[i] << " ";
}
cout << ans[i] << endl;
return 0;
}
/*
9
73 45 11 58 82 25 67 38 42
1 6
2 3
-1 -1
-1 4
5 -1
-1 -1
7 -1
-1 8
-1 -1
*/
最痛苦的是,,看错题....
下面这个最主要的错.....就是题目的意思是输入节点所在那一行的 行号,就是该行节点的父节点....然后 我看例子直接理解成了,先向左构造左子树,再构造右子树,当两个子节点都是-1,就回退..........然后就错了
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<vector>
#include<algorithm>
using namespace std;
const int N = 200+5;
struct Node {
int l, r;
int data;
} T[N];
int D[N], L[N], R[N], level[N];
vector<int> ans;
int cnt = 0, idx=0;
void CreateT(int r, int IDX) {
int a=L[idx], b=R[idx];
if(r == -1)return;
// cin >> a >> b;
T[r].l = a;
T[r].r = b;
if(a!=-1)idx++;
CreateT(a, IDX<<1);
T[r].data = D[cnt++];
// level[IDX] = T[r].data;
// cout<<IDX << "层次遍历:" << level[IDX] << endl;
// cout << r << "对应的数: "<< D[cnt-1] << endl;
if(b!=-1)idx++;
CreateT(b, IDX<<1|1);
}
void Level(){
queue<int> q;
q.push(0);
while(!q.empty()){
int tmp = q.front();
q.pop();
if(tmp == -1) continue;
ans.push_back(T[tmp].data);
q.push(T[tmp].l);
q.push(T[tmp].r);
}
}
int main() {
int n;
cin >> n;
for(int i=0; i<n; i++) {
cin >> L[i] >> R[i];
}
for(int i=0; i<n; i++) {
cin >> D[i];
}
sort(D, D+n);
CreateT(0, 1);
/*//中序遍历的结果
for(int i=0; i<n-1; i++) {
cout << T[i].data << " ";
}
cout << T[n-1].data << endl;*/
int cnt = 0, i=0;
Level();
/* while(cnt<n) {
if(level[i]) {
if(cnt == n-1)
cout << level[i] << endl;
else
cout << level[i] << " ";
cnt++;
}
i++;
}*/
for(i=0; i<ans.size()-1; i++){
cout << ans[i] << " ";
}
cout << ans[i] << endl;
return 0;
}
/*
9
73 45 11 58 82 25 67 38 42
1 6
2 3
-1 -1
-1 4
5 -1
-1 -1
7 -1
-1 8
-1 -1
*/