Рубрики
Без рубрики

Решение: самые глубокие листья суммы

Это является частью серии пояснений решения LeetCode (индекс). Если вам понравилось это решение или Фу … помечены алгоритмами, JavaScript, Java, Python.

Это является частью серии объяснений решения 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) {
        Queue q = 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 {
    List sums = 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) {
        queue q;
        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:
    vector sums;
    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”