参考了 http://blog.csdn.net/iaccepted/article/details/20726067 的思想
这个题很好的利用了树的的各种性质,很值得琢磨。
首先:完全二叉树 放在以1为开始编号的数组中满足
左孩子的编号 = root编号*2;
右孩子的编号 = root编号*2+1;
而且按数组顺序输出直接就是层序遍历的顺序。
其次:二叉搜索树的中序序列就是顺序排序。
有了这两个性质就能很快的解决这个问题。
#include <iostream>
#include <algorithm>
#include <cstring>
#include <climits>
#include <string>
#include <map>
#include <stack>
#include <queue>
#include <set>
#define MAX 1010
using namespace std;
int n ;
int list[MAX],ans[MAX];
int pos = 1;
void build(int root){
if(root > n)
return;
int l = 2 * root ,r = 2*root + 1;
build(l);
ans[root] = list[pos++];
build(r);
}
int main(){
scanf("%d",&n);
for(int i =1 ; i <= n;i++){
scanf("%d",&list[i]);
}
sort(&list[1],&list[1]+n);
build(1);
printf("%d",ans[1]);
for(int i = 2 ;i <= n ;i++)
printf(" %d",ans[i]);
printf("\n");
return 0;
}