P15801 [GESP202603 六级] 完全二叉树(只有80分)

#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值