Это является частью серии объяснений решения LeetCode ( index ). Если вам понравилось это решение или нашел его полезным, Пожалуйста, как этот пост и/или УПОТАТЬ Мое решение пост на форумах LeetCode Отказ
Проблема летета # 1302 (средний): самая глубокая сумма листьев
Описание:
( Перейти к : Идея решения Код : JavaScript | Python |. Java |. C ++
Учитывая root
бинарного дерева, Вернуть сумму значений его глубочайших листьев Отказ
Примеры:
Вход: | root = [ 1,2,3,4,5, NULL, 6,7, NULL, NULL, NULL, NULL, 8] |
Вывод: | 15 |
Визуальный |
Вход: | root = [6,7,8,2,7,1,3,9, NULL, 1,4, NULL, NULL, NULL, 5] |
Вывод: | 19 |
Ограничения:
- Количество узлов в дереве находится в диапазоне
[1, 104]
. 1.Val
Идея:
( Перейти к : Описание проблемы Код : JavaScript | Python |. Java |. C ++
Когда попросили найти информацию о конкретной строке Бинарное дерево нормальная мысль – использовать Широк-первый поиск ( BFS ) Подход. Подход BFS обычно включает в себя использование очередь Структура данных ( q ) Так что мы имеем дело с узлами дерева в правильном порядке.
Хитрость состоит в том, чтобы иметь дело с одним ряд за раз, делая ноту о длине очереди ( QLEN ), когда мы запускаем строку. Как только мы обработали, что многие узлы, мы знаем, что мы только что закончили текущую строку и любые оставшиеся записи в Q от следующего ряда. Это можно легко достичь с помощью вложенного петли.
В этом случае обработка узла просто означает накапливание проработания всего ( ans ) для строки, а затем перемещение любых детей узла на конец очереди.
Когда мы начнем новый строк, мы можем сбросить и Вернуться к 0 , а затем просто продолжать обработать ряды до Q пусто. Последнее значение АНС должен быть наш последний ответ, поэтому мы должны Вернуть АНС Отказ
Поочередно мы можем использовать Глубинный поиск ( DFS ) Подход с Рекурсия пройти двоичное дерево. Если мы передаем глубину строки ( LVL ) в качестве аргумента нашей рекурсивной функции ( DFS ), мы можем использовать его для обновления значений в массиве сумм строки ( суммы ) Использование LVL как индекс ( суммы [LVL] ). Тогда мы можем просто вернуть Последнее значение суммы как наш ответ.
Выполнение:
Между четыреми языками есть только незначительные различия.
Код JavaScript:
( Перейти к : Описание проблемы Идея решения
W/BFS:
var deepestLeavesSum = function(root) { let q = [root], ans, qlen, curr while (q.length) { qlen = q.length, ans = 0 for (let i = 0; i < qlen; i++) { curr = q.shift(), ans += curr.val if (curr.left) q.push(curr.left) if (curr.right) q.push(curr.right) } } return ans };
ж/рекурсивные дфс:
var deepestLeavesSum = function(root) { let sums = [] const dfs = (node, lvl) => { if (lvl === sums.length) sums[lvl] = node.val else sums[lvl] += node.val if (node.left) dfs(node.left, lvl+1) if (node.right) dfs(node.right, lvl+1) } dfs(root, 0) return sums[sums.length-1] };
Код Python:
( Перейти к : Описание проблемы Идея решения
W/BFS:
class Solution: def deepestLeavesSum(self, root: TreeNode) -> int: q, ans, qlen, curr = [root], 0, 0, 0 while len(q): qlen, ans = len(q), 0 for _ in range(qlen): curr = q.pop(0) ans += curr.val if curr.left: q.append(curr.left) if curr.right: q.append(curr.right) return ans
ж/рекурсивные дфс:
class Solution: def deepestLeavesSum(self, root: TreeNode) -> int: sums = [] def dfs(node: TreeNode, lvl: int): if lvl == len(sums): sums.append(node.val) else: sums[lvl] += node.val if node.left: dfs(node.left, lvl+1) if node.right: dfs(node.right, lvl+1) dfs(root, 0) return sums[-1]
Java код:
( Перейти к : Описание проблемы Идея решения
W/BFS:
class Solution { public int deepestLeavesSum(TreeNode root) { Queueq = new LinkedList<>(); q.add(root); int ans = 0, qlen = 0; while (q.size() > 0) { qlen = q.size(); ans = 0; for (int i = 0; i < qlen; i++) { TreeNode curr = q.poll(); ans += curr.val; if (curr.left != null) q.add(curr.left); if (curr.right != null) q.add(curr.right); } } return ans; } }
ж/рекурсивные дфс:
class Solution { Listsums = new ArrayList<>(); public int deepestLeavesSum(TreeNode root) { dfs(root, 0); return sums.get(sums.size()-1); } public void dfs(TreeNode node, int lvl) { if (lvl == sums.size()) sums.add(node.val); else sums.set(lvl, sums.get(lvl) + node.val); if (node.left != null) dfs(node.left, lvl+1); if (node.right != null) dfs(node.right, lvl+1); } }
C ++ код:
( Перейти к : Описание проблемы Идея решения
W/BFS:
class Solution { public: int deepestLeavesSum(TreeNode* root) { queueq; q.push(root); int ans = 0, qlen = 0; while (q.size() > 0) { qlen = q.size(), ans = 0; for (int i = 0; i < qlen; i++) { TreeNode* curr = q.front(); q.pop(); ans += curr->val; if (curr->left) q.push(curr->left); if (curr->right) q.push(curr->right); } } return ans; } };
ж/рекурсивные дфс:
class Solution { public: vectorsums; int deepestLeavesSum(TreeNode* root) { dfs(root, 0); return sums.back(); } void dfs(TreeNode* node, int lvl) { if (lvl == sums.size()) sums.push_back(node->val); else sums[lvl] += node->val; if (node->left) dfs(node->left, lvl+1); if (node->right) dfs(node->right, lvl+1); } };
Оригинал: “https://dev.to/seanpgallivan/solution-deepest-leaves-sum-1936”