方法就是按照慕课上的讲解来的,使用C++实现。
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
int countLeftSize(int num_size){
int height = static_cast<int>(log2(num_size + 1));
int lastLayerSize = num_size + 1 - pow(2, height);
int leftSize = pow(2, height - 1) - 1;
int lastLayerMax = pow(2, height);
if(lastLayerSize > lastLayerMax / 2) lastLayerSize = lastLayerMax / 2;
return leftSize + lastLayerSize;
}
void buildTree(int rootIndex, int startIndex, int endIndex, const vector<int>& nums, vector<int>& tree){
if(endIndex - startIndex < 0)
return;
int num_size = endIndex - startIndex + 1;
if(num_size == 1) {
tree[rootIndex] = nums[startIndex];
return;
}
int left_size = countLeftSize(num_size);
int middle = startIndex + left_size;
tree[rootIndex] = nums[middle];
int leftIndex = rootIndex * 2 + 1;
int rightIndex = leftIndex + 1;
buildTree(leftIndex, startIndex, middle - 1, nums, tree);
buildTree(rightIndex, middle + 1, endIndex, nums, tree);
}
int main(){
int n;
cin >> n;
vector<int> nums(n, 0);
for(int i = 0; i < n; i++){
cin >> nums[i];
}
sort(nums.begin(), nums.end());
vector<int> tree(n, 0);
buildTree(0, 0, n - 1, nums, tree);
for(int i = 0; i < n; i++){
if(i == n - 1)
cout << tree[i];
else
cout << tree[i] << " ";
}
return 0;
}