团体程序设计天梯赛 L3-010 是否完全二叉搜索树 (30分)
题目链接:
L3-010 是否完全二叉搜索树 (30分)
思路:
可以模仿线段树建树的方式,用数组建树,然后遍历
代码:
#include<bits/stdc++.h>
using namespace std;
#define l (u << 1)
#define r (u << 1 | 1)
int n, tree[(1 << 20) + 5];
inline void push(int & x, int u) {
if(tree[u] == 0) { tree[u] = x; return; }
if(x > tree[u]) push(x, l);
else push(x, r);
}
void bfs() {
queue<int> que;
que.push(1);
while(!que.empty()) {
int u = que.front();
que.pop();
if(u != 1) cout << ' ';
cout << tree[u];
if(tree[l]) que.push(l);
if(tree[r]) que.push(r);
}
cout << '\n';
}
int main() {
#ifdef MyTest
freopen("Sakura.txt", "r", stdin);
#endif
cin >> n;
for(int i = 0; i < n; i++) { int x; cin >> x; push(x, 1); };
bfs();
for(int i = 1; i <= n; i++) if(!tree[i]) { puts("NO"); exit(0); }
puts("YES");
return 0;
}