TGViewer
Java | LeetCode Java | LeetCode @easy_java_task · 6.43K subscribers
Post #1610 718
Задача: 508. Most Frequent Subtree Sum
Сложность: medium

Дано корень бинарного дерева, вернуть наиболее часто встречающуюся сумму поддерева. Если есть несколько таких значений, вернуть все значения с наибольшей частотой в любом порядке.

Сумма поддерева узла определяется как сумма всех значений узлов, образованных поддеревом, укорененным в этом узле (включая сам узел).

Пример:
Input: root = [5,2,-3]
Output: [2,-3,4]


👨‍💻 Алгоритм:

1⃣Инициализация переменных
Инициализируйте переменные sumFreq для хранения частоты всех сумм поддеревьев. Инициализируйте maxFreq для хранения максимальной частоты. Создайте массив maxFreqSums для хранения всех сумм поддеревьев, частота которых равна максимальной.

2⃣Обход дерева и вычисление сумм
Выполните обход дерева в порядке post-order. Используйте суммы поддеревьев левого и правого дочерних узлов для вычисления суммы текущего поддерева. Увеличьте частоту текущей суммы в sumFreq. Обновите maxFreq, если частота текущей суммы больше текущего maxFreq.

3⃣Сборка результата
Пройдитесь по sumFreq и добавьте все суммы с частотой, равной maxFreq, в массив maxFreqSums. Верните массив maxFreqSums.

😎 Решение:
class Solution {
private HashMap<Integer, Integer> sumFreq = new HashMap<Integer, Integer>();
private Integer maxFreq = 0;

private int subtreeSum(TreeNode root) {
if (root == null) {
return 0;
}

int leftSubtreeSum = subtreeSum(root.left);
int rightSubtreeSum = subtreeSum(root.right);

int currSum = root.val + leftSubtreeSum + rightSubtreeSum;

sumFreq.put(currSum, sumFreq.getOrDefault(currSum, 0) + 1);
maxFreq = Math.max(maxFreq, sumFreq.get(currSum));
return currSum;
}

public int[] findFrequentTreeSum(TreeNode root) {
subtreeSum(root);

List<Integer> ansList = new ArrayList<Integer>();
for (Map.Entry<Integer, Integer> mapElement : sumFreq.entrySet()) {
Integer sum = mapElement.getKey();
Integer freq = mapElement.getValue();

if (freq == maxFreq) {
ansList.add(sum);
}
}

int maxFreqSums[] = new int[ansList.size()];
for (int i = 0; i < ansList.size(); i++) {
maxFreqSums[i] = ansList.get(i).intValue();
}

return maxFreqSums;
}
}


Ставь 👍 и забирай 📚 Базу знаний
More from @easy_java_task
  1. Oct 17, 2026Post #2303
  2. Oct 17, 2026Задача: 1431. Kids With the Greatest Number of Candies Сложность: easy Дано n детей с конф…
  3. Oct 16, 2026Задача: 735. Asteroid Collision Сложность: medium Нам дан массив asteroids, состоящий из ц…
  4. Oct 16, 2026Post #2300
  5. Oct 15, 2026Задача: 229. Majority Element II Сложность: medium Дан массив целых чисел размера n, найди…
  6. Oct 14, 2026Задача: 1332. Remove Palindromic Subsequences Сложность: easy Вам дана строка s, состоящая…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →