Сложность: easy
Дано корень бинарного дерева поиска (BST) с дубликатами. Необходимо вернуть все моды (т.е. самые часто встречающиеся элементы) в этом дереве.
Если в дереве более одной моды, верните их в любом порядке.
Предположим, что BST определяется следующим образом:
Левое поддерево узла содержит только узлы с ключами, меньшими или равными ключу этого узла.
Правое поддерево узла содержит только узлы с ключами, большими или равными ключу этого узла.
Оба поддерева также должны быть бинарными деревьями поиска.
Пример:
Input: root = [1,null,2,2]
Output: [2]
👨💻 Алгоритм:
1⃣Обход дерева
Выполните обход дерева (inorder DFS) с использованием рекурсивной функции dfs, чтобы пройти по всем узлам дерева. На каждом узле добавьте node.val в список values.
2⃣Поиск мод
Инициализируйте переменные maxStreak, currStreak, currNum как 0 и пустой список ans. Пройдите по списку values. Для каждого числа num: если num равно currNum, увеличьте currStreak. Иначе, установите currStreak равным 1, а currNum равным num. Если currStreak больше maxStreak, обновите maxStreak и сбросьте ans. Если currStreak равен maxStreak, добавьте num в ans.
3⃣Возврат результата
Верните список ans.
😎 Решение:
class Solution {
public int[] findMode(TreeNode root) {
List<Integer> values = new ArrayList();
dfs(root, values);
int maxStreak = 0;
int currStreak = 0;
int currNum = 0;
List<Integer> ans = new ArrayList();
for (int num : values) {
if (num == currNum) {
currStreak++;
} else {
currStreak = 1;
currNum = num;
}
if (currStreak > maxStreak) {
ans = new ArrayList();
maxStreak = currStreak;
}
if (currStreak == maxStreak) {
ans.add(num);
}
}
int[] result = new int[ans.size()];
for (int i = 0; i < ans.size(); i++) {
result[i] = ans.get(i);
}
return result;
}
public void dfs(TreeNode node, List<Integer> values) {
if (node == null) {
return;
}
dfs(node.left, values);
values.add(node.val);
dfs(node.right, values);
}
}Ставь 👍 и забирай 📚 Базу знаний
