算法思想:
- 先建立只知道下标的树。静态的。
- 将这个数组从大到小排序。
- 然后对于这棵树,采用中序遍历的办法,去从头到尾抓取这个数组的值。
代码如下:
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <stdio.h>
#include <math.h>
#include <queue>
#include <vector>
#include <cstring>
#include <cmath>
using namespace std;
int num;
int index1;
int a[1010];
struct node
{
int data;
int left,right;
}tree[100];
void DFS(int root){
if(root==-1){
return;
}
else{
DFS(tree[root].left);
tree[root].data=a[index1++];
DFS(tree[root].right);
}
}
void BFS(int root){
queue<int> q;
q.push(root);
int k=0;
while(!q.empty()){
int f=q.front();
k++;
printf("%d",tree[f].data);
if(k<num){
printf(" ");
}
if(tree[f].left!=-1){
q.push(tree[f].left);
}
if(tree[f].right!=-1){
q.push(tree[f].right);
}
q.pop();
}
}
int main()
{
scanf("%d",&num);
for(int i=0; i<num; i++)
{
int l,r;
scanf("%d%d",&l,&r);
if(l!=-1){
tree[i].left=l;
}else{
tree[i].left=-1;
}
if(r!=-1){
tree[i].right=r;
}else{
tree[i].right=-1;
}
}
for(int i=0;i<num;i++){
scanf("%d",&a[i]);
}
sort(a,a+num);
DFS(0);
BFS(0);
return 0;
}