按照完全二叉树理解 n个数正好对应n个位置   镜像的写法最后在判断

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<queue>
#include<vector>
#include<map>
#include<math.h>
using namespace std;
#define INF 0x3f3f3f3f
#define LL long long
#define N 1000700
int w[N],a[N],ans,dis[N],falg,n,vis[N];
void Q(int e,int x,int y)
{
    if(a[x]==-1)
    {
        a[x]=w[y];
        return ;
    }
    if(e>=a[x])
        Q(e,x*2,y);
    else
        Q(e,x*2+1,y);
}
void QQ(int x)
{
    queue<int>Q;
    Q.push(x);
    while(Q.size())
    {
        int ww=Q.front();Q.pop();
        if(a[ww]==-1) continue;
        vis[ans++]=a[ww];
        Q.push(ww*2);
        Q.push(ww*2+1);
    }
}
int main()
{
    int n;
    scanf("%d",&n);
    fill(a,a+N,-1);
    for(int i=1; i<=n; i++)
        scanf("%d",&w[i]);
    for(int i=1; i<=n; i++)
        Q(w[i],1,i);
    ans=1;
    QQ(1);
    for(int i=1;i<=n;i++)
        printf("%d%c",vis[i],i==n?'\n':' ');
    int falg=0;
    for(int i=1;i<=n;i++)
        if(a[i]==-1)
            falg=1;
    if(!falg) printf("YES\n");
    else printf("NO\n");
    return 0;
}

 

posted on 2017-03-23 13:55  云胡不喜。  阅读(207)  评论(0编辑  收藏  举报