2049. 統計最高分的節點數目
阿新 • • 發佈:2022-03-11
給你一棵根節點為 0 的 二叉樹 ,它總共有 n 個節點,節點編號為 0 到 n - 1 。同時給你一個下標從 0 開始的整數陣列 parents 表示這棵樹,其中 parents[i] 是節點 i 的父節點。由於節點 0 是根,所以 parents[0] == -1 。
一個子樹的 大小 為這個子樹內節點的數目。每個節點都有一個與之關聯的 分數 。求出某個節點分數的方法是,將這個節點和與它相連的邊全部 刪除 ,剩餘部分是若干個 非空 子樹,這個節點的 分數 為所有這些子樹 大小的乘積 。
請你返回有 最高得分 節點的 數目 。
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/count-nodes-with-the-highest-score
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。
import java.util.*; class Solution { public int countHighestScoreNodes(int[] parents) { int n = parents.length; int[] in = new int[n]; for (int i = 0; i < n; ++i) { if (parents[i] != -1) { in[parents[i]]++; } } Node[] nodes = new Node[n]; Queue<Integer> queue = new LinkedList<>(); for (int i = 0; i < n; ++i) { if (in[i] == 0) { queue.offer(i); } nodes[i] = new Node(); } while (!queue.isEmpty()) { int child = queue.poll(); int parent = parents[child]; if (parent != -1) { nodes[parent].nodeNum += nodes[child].nodeNum; nodes[parent].children.add(child); in[parent]--; if (in[parent] == 0) { queue.offer(parent); } } } long maxScore = 0; int cnt = 0; for (int i = 0; i < n; ++i) { int parent = parents[i]; long multiply = parent == -1 ? 1 : (n - nodes[i].nodeNum); for (int child : nodes[i].children) { multiply *= nodes[child].nodeNum; } if (maxScore == multiply) { cnt++; } else if (multiply > maxScore) { maxScore = multiply; cnt = 1; } } return cnt; } } class Node { int nodeNum = 1; List<Integer> children = new ArrayList<>(); }