思路:
插入数据建立二搜索树,再用bfs获取二叉树的层序遍历,
再判断二叉完全:遍历tree数组1 ~ n若有点值为-1则代表不是完全二叉树。
代码:
#include <bits/stdc++.h>
#define fastio ios::sync_with_stdio(false), cin.tie(NULL), cout.tie(NULL)
#define debug(a) cout << "debug : " << (#a) << " = " << a << endl
#define lson idx << 1
#define rson idx << 1 | 1
using namespace std;
typedef long long ll;
typedef pair<int, int> PII;
const int N = 10010;
const int INF = 0x3f3f3f3f;
const double eps = 1e-6;
const int mod = 998244353;
int n;
int a[N]; //存输入序列
int tree[N]; //只存值
void Build()
{
memset(tree, -1, sizeof tree);
tree[1] = a[1]; //第一个数为根节点
for (int i = 2; i <= n; i++) //插入剩下的n-1个到树中
{
int k = a[i]; //此时插入的值为k
int idx = 1; //初始化插入节点为根节点
while (tree[idx] != -1) //循环查找符合要求的插入点
{
if (tree[idx] > k) //当插入值小于此节点值则为右子树
idx = rson;
else
idx = lson;
}
tree[idx] = k;
}
}
bool flag = true;
vector<int> tier;
void bfs_tier()
{
queue<int> q;
q.push(1);
while (q.size())
{
int t = q.front();
q.pop();
int idx = t;
tier.push_back(tree[idx]);
if (tree[lson] != -1)
q.push(lson);
if (tree[rson] != -1)
q.push(rson);
}
}
int main()
{
cin >> n;
for (int i = 1; i <= n; i++)
cin >> a[i];
Build();
bfs_tier();
for (int i = 0; i < tier.size(); i++)
{
if (i != 0)
cout << ' ';
cout << tier[i];
}
cout << endl;
for (int i = 1; i <= n; i++)
if (tree[i] == -1)
{
flag = false;
break;
}
if (flag)
cout << "YES" << endl;
else
cout << "NO" << endl;
return 0;
}