一开始只想着建树,然后想像AVL树那样通过建树过程中的变换,来整棵树最后成为一颗完全二叉树,但是推了半天没找到规律。就去网上看了下别人的思路。。真是一看就明白了,好简单。
利用二叉搜索树的一个性质:中序遍历BST,得到的就是升序的序列。
把思路转变下,已知存在了一颗完全二叉树,那么如果它还是一颗BST,那它的中序遍历结果一定是升序的,因此,先将输入的数字序列升序排列,再中序遍历完全二叉树,得到位置的序列,最后将升序的序列一个个填入位置序列即可。
#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
int n;
int CBT[1005];
vector<int> num;
vector<int> pos;
void dfs(int v){
if(v > n) return;
dfs(v*2);
pos.push_back(v);
dfs(v*2+1);
}
int main(){
scanf("%d",&n);
num.resize(n);
for(int i = 0; i < n; ++i){
scanf("%d",&num[i]);
}
sort(num.begin(),num.end());
dfs(1);
for(int i = 0; i < pos.size(); ++i){
CBT[pos[i]] = num[i];
}
printf("%d",CBT[1]);
for(int i = 2; i <= n; ++i)
printf(" %d",CBT[i]);
return 0;
}