虽然 AC/提交 超0.6,不过刚开始感觉不会做啊。。。脑子堵路了
说下思路
step 1 :根据完全二叉树(CBT)的父亲孩子节点的序号关系,节点 i 的孩子节点为 2*i 和 2*i+1 ,建立CBT,节点下标很有用,所以用的是静态数组;
step 2 :中序遍历建好的CBT,得到中序遍历下,节点下标的数组序列inorder;
step 3 :把输入数组升序排序得到数组input;
step 4 :这样inorder与input按序号一一对应;
step 5:最后再按节点下标升序输出是所求层序排序。
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
const int MAX = 1010;
struct node{
int data;
int lchild;
int rchild;
node():data(0),lchild(-1),rchild(-1){}
}node[MAX];
vector<int> in,input;
void buildCBT(int n){
for(int i=1;i<=n/2;i++){
node[i].lchild=2*i;
if(2*i+1<=n){
node[i].rchild=2*i+1;
}
}
}
void inorder(int root){
if(root==-1){
return;
}
inorder(node[root].lchild);
in.push_back(root);
inorder(node[root].rchild);
}
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++){
int temp;
scanf("%d",&temp);
input.push_back(temp);
}
buildCBT(n);
inorder(1);
sort(input.begin(),input.end());
for(int i=0;i<n;i++){
node[in[i]].data=input[i];
}
for(int i=1;i<=n;i++){
if(i!=1) printf(" ");
printf("%d",node[i].data);
}
return 0;
}