2049.统计最高分的节点数目
链接:2049.统计最高分的节点数目
难度:Medium
标签:树、深度优先搜索、数组、二叉树
简介:请你返回有 最高得分 节点的 数目 。
题解 1 - cpp
- 编辑时间:2022-03-11
- 执行用时:128ms
- 内存消耗:79.6MB
- 编程语言:cpp
- 解法介绍:统计每个点的父节点,左子树个数,右子树个数。
class Solution {
   public:
    struct node {
        int parent, left, right, lcnt, rcnt;
    };
    // ans
    int ans = 0;
    long long maxnum = -1;
    void setAns(long long num) {
        if (num >= maxnum) {
            if (num > maxnum) ans = 0;
            ans++;
            maxnum = num;
        }
    }
    int countHighestScoreNodes(vector<int>& parents) {
        int n = parents.size();
        vector<node> list(n);
        // init
        for (int i = 0; i < n; i++) {
            list[i].parent = parents[i];
            list[i].left = list[i].right = -1;
            list[i].lcnt = list[i].rcnt = 0;
        }
        // load
        for (int i = 1; i < n; i++) {
            if (list[list[i].parent].left == -1)
                list[list[i].parent].left = i;
            else
                list[list[i].parent].right = i;
        }
        // check
        int sum = check(list, 0);
        // res
        for (int i = 1; i < n; i++) {
            if (list[i].lcnt == 0 && list[i].rcnt == 0) {
                setAns((long long)list[0].lcnt + list[0].rcnt);
                continue;
            }
            setAns((long long)format(sum - 1 - list[i].lcnt - list[i].rcnt) *
                   format(list[i].lcnt) * format(list[i].rcnt));
        }
        // res0
        setAns((long long)format(list[0].lcnt) * format(list[0].rcnt));
        return ans;
    }
    int check(vector<node>& list, int node) {
        int ans = 0;
        if (list[node].left != -1) {
            list[node].lcnt = check(list, list[node].left);
            ans += list[node].lcnt;
        }
        if (list[node].right != -1) {
            list[node].rcnt = check(list, list[node].right);
            ans += list[node].rcnt;
        }
        return ans + 1;
    }
    int format(int num) { return num == 0 ? 1 : num; }
};