1064 Complete Binary Search Tree (30分)
这题的话,首先要知道什么是满二叉树,满二叉树就是和完全二叉树的点一一对应,但是最下面一层可以不放满,但是左边的叉不能为空,必须从左到右排列的一种树。
这题借鉴了别人的思路:
为了让左边放满,我们中序遍历构建一颗二叉树,这样就保证左边的点可以放满了,同时和完全二叉树点的编号一一对应,这个思路真的挺不错的。
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int MAXN=1e6+10;
int a[1009],b[1009];
int N,ind=1;
void dfs(int rt) {
if (rt>N) return;
dfs(rt*2);
b[rt]=a[ind++];
dfs(rt*2+1);
}
int main() {
// freopen("in.txt","r",stdin);
scanf("%d",&N);
for (int i=1;i<=N;i++) { scanf("%d",&a[i]); }
sort(a+1,a+1+N);
dfs(1);
for (int i=1;i<=N;i++) { printf("%d",b[i]); if (i<N) putchar(' '); }
return 0;
}