#include<bits/stdc++.h>
using namespace std;
const int MAXN = 100008;
int l[MAXN], r[MAXN];
bool a[MAXN];
//层序遍历检查子树是否符合完全二叉树的层序规则
bool check(int u) {
if (u == 0) return true;
queue<int> q;
q.push(u);
bool m = false;
while (!q.empty()) {
int cur = q.front();
q.pop();
if (cur == 0) {
m = true;
continue;
}
if (m) return false;
q.push(l[cur]);
q.push(r[cur]);
}
return true;
}
//后序遍历求dp[u]
void dp(int u) {
if (u == 0) {
a[u] = true;
return;
}
// 先递归处理左右子树,拿到子树的dp值
dp(l[u]);
dp(r[u]);
//左右子树都是完全二叉树 + 当前子树层序
a[u] = a[l[u]] && a[r[u]] && check(u);
}
int main() {
int n;
cin >> n;
for (int i = 1; i <= n; ++i) {
cin >> l[i] >> r[i];
}
// 对每个节点执行树形DP
for (int i = 1; i <= n; ++i) {
dp(i);
}
//统计结果
int sum = 0;
for (int i = 1; i <= n; ++i) {
if (a[i]) sum++;
}
cout << sum << endl;
return 0;
}
P15801 [GESP202603 六级] 完全二叉树(只有80分)
于 2026-03-28 22:26:08 首次发布
675

被折叠的 条评论
为什么被折叠?



