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;
}
posted @ 2020-05-31 21:58  xyee  阅读(113)  评论(0编辑  收藏  举报