深搜
2026-08-28 13:53:49
发布于:广东
1阅读
0回复
0点赞
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const ll N = 2e5+10;
ll n, ans;
ll l[N], r[N]; // l[i]: 节点i的左儿子, r[i]: 节点i的右儿子
// 判断以节点u为根的子树是否是完全二叉树
bool isComplete(ll u) {
if (u == 0) return true; // 空树是完全二叉树
queue<ll> q;
q.push(u);
bool hasNull = false; // 是否遇到过空节点
while (!q.empty()) {
ll now = q.front();
q.pop();
if (now == 0) {
hasNull = true;
} else {
// 如果已经遇到过空节点,但现在又遇到非空节点
if (hasNull) return false;
q.push(l[now]);
q.push(r[now]);
}
}
return true;
}
// DFS遍历每个节点,统计完全二叉树的数量
void dfs(ll u) {
if (u == 0) return;
if (isComplete(u)) ans++;
dfs(l[u]);
dfs(r[u]);
}
int main() {
cin >> n;
for (ll i = 1; i <= n; i++) {
cin >> l[i] >> r[i];
}
ans = 0;
dfs(1);
cout << ans << endl;
return 0;
}
这里空空如也


有帮助,赞一个