原题链接
题目要求我们按给定数字顺序构建一颗左子树大,右子树小的二叉搜索树,并给出层序遍历结果与该树是否为完全二叉树。
由于题目给出的数据范围 N ≤ 20,这个题目可以用数组存树,数组的大小最多只需要1 << 20
即可(最坏情况排成一条链)
当我们按照二叉搜索树规则把数放进数组中,将其中所有非0数输出就是题目要求的层序遍历结果,如果所有非0数是连续的(中间没有间隔0)那么这颗树一定是完全二叉树,否则不是。
c++代码
#include <bits/stdc++.h>
using namespace std;
int tr[1<<21];
void insert(int u,int x)
{
if(tr[u]==0) tr[u]=x;
else if(tr[u]<x) insert(u<<1,x);
else insert((u<<1)+1,x);
}
int main()
{
ios::sync_with_stdio(false),cin.tie(0);
int n;
cin>>n;
for(int i=1;i<=n;i++) {
int x;
cin>>x;
insert(1,x);
}
bool flag=true;
for(int i=1,j=0;i<1<<21;i++) {
if(tr[i]) cout<<tr[i]<<" \n"[++j==n];
else flag=flag&&(j==n);
}
cout<<(flag?"YES":"NO")<<'\n';
return 0;
}