题目
思路 DFS
先构建二叉树,再深度优先搜索,找到以每个节点为根的子树的大小,dfs的过程中判断该节点的得分是否是最大。最后直接返回最高得分节点的数目。
代码
class Solution {
public:
int cnt = 0, n;
long maxScore = 0;
vector<vector<int>> child;
int countHighestScoreNodes(vector<int>& parents) {
n = parents.size();
child.resize(n);
for(int i = 1; i < n; i++)
child[parents[i]].push_back(i);
dfs(0);
return cnt;
}
int dfs(int x){
long score = 1;
int size = n - 1; //以除去以x为根节点的子树的节点数
for(int c : child[x]){
int t = dfs(c);
score *= t;
size -= t;
}
if(x != 0) score *= size;
if(maxScore < score){
cnt = 1;
maxScore = score;
}else if(maxScore == score)
cnt++;
return n - size;
}
};