#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define maxn 1005
int a[maxn], ans[maxn];
int cmp(const void* a, const void* b) {
return *(int *)a - *(int *)b;
}
int min(int a, int b) {
return a > b ? b : a;
}
//计算n个节点的完全二叉树的左子树节点数
int Count_Left(int n) {
int H, x, left; //完全二叉树中满二叉树的高度;
H = floor(log10(n+1)/log10(2));//换底公式,先求出H再求x;
x = n - (1 << H) + 1;
x = min(x, (1 << (H-1)));
left = (1 << (H-1)) - 1 + x;
return left;
}
//向解答树中填数
void Solve(int low, int high, int aim) {
int n, left;
int Raim, Laim;
n = high - low + 1;
if(n == 0) return;
//递归求解退出条件;
left = Count_Left(n);
Laim = 2*aim + 1;
Raim = Laim + 1;
ans[aim] = a[low+left];
Solve(low, low+left-1, Laim);
Solve(low+left+1, high, Raim);
}
int main() {
int n;
int i, flag = 0;
scanf("%d", &n);
for(i = 0; i < n; i++)
scanf("%d", &a[i]);
qsort(a, n, sizeof(int), cmp);
//由于二叉搜索树的性质,排序后可由左子树节点个数推知节点大小次序;
Solve(0, n-1, 0);
for(i = 0; i < n; i++) {
if(!flag) flag = 1;
else printf(" ");
printf("%d", ans[i]);
}
return 0;
}
04-树6 Complete Binary Search Tree (30分)
最新推荐文章于 2023-05-25 11:56:50 发布