# 2049. Count Nodes With the Highest Score
###### tags: `Leetcode` `Medium` `Tree`
Link: https://leetcode.com/problems/count-nodes-with-the-highest-score/
## 思路 $O(N)$ $O(N)$
The value of a node is the product of:
1. number of nodes in the left subtree,
2. number of nodes in the right subtree,
3. number of all other nodes, excluding the current one (n - left - right - 1)
4. We can just use DFS to count child nodes for (1) and (2), and we can then compute (3) as we know the total nubers of nodes.
## Code
```java=
class Solution {
long maxScore;
public int countHighestScoreNodes(int[] parents) {
List<List<Integer>> tree = new ArrayList<>();
for(int i=0; i<parents.length; i++){
tree.add(new ArrayList<>());
}
for(int i=1; i<parents.length; i++){
tree.get(parents[i]).add(i);
}
maxScore = 0;
long[] scores = new long[parents.length];
dfs(tree, scores, 0);
int ans = 0;
for(long score:scores){
if(score==maxScore) ans++;
}
return ans;
}
private int dfs(List<List<Integer>> tree, long[] scores, int root){
int c1=0, c2=0;
if(tree.get(root).size()!=0) c1 = dfs(tree, scores, tree.get(root).get(0));
if(tree.get(root).size()==2) c2 = dfs(tree, scores, tree.get(root).get(1));
long currScore = Math.max(c1, 1)*Math.max(c2, 1);
currScore = currScore*(long)(Math.max(tree.size()-c1-c2-1, 1));
scores[root] = currScore;
maxScore = Math.max(currScore, maxScore);
return c1+c2+1;
}
}
```