您的位置:首页 > 其它

1064. Complete Binary Search Tree

2013-08-30 23:33 120 查看
#include <iostream>
#include <cstdio>
#include <string>
#include <vector>
#include <algorithm>
#include <set>
#include <cmath>
using namespace std;

vector<int>v;
int ans[1010];
int n;

int indexOfRoot(int size)
{
double t = log(size + 1) / log(2);
int level = t;
t -= level;
if(t > 0) level ++;   //计算该树有几层
int index = pow(2, level - 1);  // 当为满二叉树时,root就为中间的那个节点
int sumOfLast = size - pow(2, level - 1) + 1;  // 当为非满二叉树,缺的肯定在最后一行,我们只要看
if(sumOfLast < index / 2) index -= (index / 2 - sumOfLast); // 最后一行有没有满一半,不够一半就要更新index
return index;
}

void cal(int i, int start, int end)
{
if(start > end) return;
int index = start + indexOfRoot(end - start + 1) - 1;
ans[i] = v[index];
if(2 * i <= n) cal(2 * i, start, index - 1);
if(2 * i + 1 <= n) cal(2 * i + 1, index + 1, end);
}

int main()
{
int x;
scanf("%d", &n);
for(int i = 0; i < n; i ++)
{
scanf("%d", &x);
v.push_back(x);
}
sort(v.begin(), v.end());
cal(1, 0, n - 1);
for(int j = 1; j < n; j ++)
printf("%d ", ans[j]);
printf("%d\n", ans
);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: