深搜
2026-08-28 14:10:27
发布于:广东
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];
// 计算树的高度,如果不是满二叉树返回-1
ll getHeight(ll u) {
if (u == 0) return 0; // 空树高度为0
ll leftH = getHeight(l[u]);
ll rightH = getHeight(r[u]);
// 如果左右子树有不是满二叉树的,返回-1
if (leftH == -1 || rightH == -1) return -1;
// 如果左右子树高度不同,不是满二叉树
if (leftH != rightH) return -1;
// 如果是叶子节点,高度为1
if (l[u] == 0 && r[u] == 0) return 1;
// 如果只有一个孩子,不是满二叉树
if (l[u] == 0 || r[u] == 0) return -1;
// 是满二叉树,高度 = 子树高度 + 1
return leftH + 1;
}
void dfs(ll u) {
if (u == 0) return;
if (getHeight(u) != -1) 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;
}
这里空空如也


有帮助,赞一个