1.建树
2.bfs序跑一次得到序列
3.dfs判断是否左子树键值大于右子树
4.再跑一遍bfs判断是完全二叉树
#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<queue>
#include<set>
using namespace std;
struct Node{
int w;
}a[1048579];
int w[99];
void build(int x){
if(a[1].w==0){
a[1].w=x;
return ;
}
int id=1;
while(1){
if(a[id].w){
if(a[id].w<x){
id=(id<<1);
}
else{
id=(id<<1|1);
}
}
else{
a[id].w=x;
break;
}
}
}
bool ff=1;
queue<int>q;
void bfs(int st){
q.push(st);
int f=1;
while(!q.empty()){
int out=q.front();
q.pop();
if(!f) printf(" ");
else f=0;
printf("%d",a[out].w);
if(((out<<1)<=524288)&&a[out<<1].w) q.push(out<<1);
if(((out<<1|1)<=1048575)&&a[out<<1|1].w) q.push(out<<1|1);
}
}
int n;
bool check(){
while(!q.empty()) q.pop();
q.push(1);
int num=0;
while(!q.empty()){
int u=q.front(); q.pop();
if(a[u].w==0){//空节点,退出
break;
}
++num;
if((u<<1)<=524288)q.push(u<<1);
if((u<<1|1)<=1048575)q.push(u<<1|1);
}
return num==n;
/*
若遍历到正好n个节点说明是一颗完全二叉树,若不相等,说明在没跑到最后一层,或者最后一层的节点不是严格的从左到右排列开来的;
*/
}
int dfs(int u){
int wl=0,wr=0;
if(((u<<1)<=524288)&&a[u<<1].w) wl=dfs(u<<1);
if(((u<<1|1)<=1048575)&&a[u<<1|1].w) wr=dfs(u<<1|1);
if(wl<=wr&&(wl||wr)) ff=0;
return wl+wr+a[u].w;
}
/*
20
20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
*/
int main(){
scanf("%d",&n);
for(int i=0;i<n;++i){
scanf("%d",&w[i]);
build(w[i]);
}
bfs(1);
dfs(1);
printf("\n");
if(check()&&ff) printf("YES\n");
else printf("NO\n");
return 0;
}