leetcode
leetcode 1101 ~ 1150
层数最深叶子节点的和

层数最深叶子节点的和

难度:

标签:

题目描述

给你一棵二叉树的根节点 root ,请你返回 层数最深的叶子节点的和

 

示例 1:

输入:root = [1,2,3,4,5,null,6,7,null,null,null,null,8]
输出:15

示例 2:

输入:root = [6,7,8,2,7,1,3,9,null,1,4,null,null,null,5]
输出:19

 

提示:

  • 树中节点数目在范围 [1, 104] 之间。
  • 1 <= Node.val <= 100

代码结果

运行时间: 91 ms, 内存: 19.0 MB


/*
 * 思路:
 * 使用Java Stream API的方式不太适合处理树的层序遍历,
 * 因为Stream API更适合处理集合类的数据。
 * 这里仍然使用BFS算法,但通过Stream API来构造和处理数据。
 */
import java.util.*;
import java.util.stream.Collectors;

class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;
    TreeNode() {}
    TreeNode(int val) { this.val = val; }
    TreeNode(int val, TreeNode left, TreeNode right) {
        this.val = val;
        this.left = left;
        this.right = right;
    }
}

public class Solution {
    public int deepestLeavesSum(TreeNode root) {
        if (root == null) return 0;
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        int sum = 0;
        while (!queue.isEmpty()) {
            List<TreeNode> currentLevel = new ArrayList<>();
            sum = 0; // reset sum for current level
            queue.stream().forEach(node -> {
                sum += node.val;
                if (node.left != null) currentLevel.add(node.left);
                if (node.right != null) currentLevel.add(node.right);
            });
            queue = new LinkedList<>(currentLevel);
        }
        return sum;
    }
}

解释

方法:

题解采用了宽度优先搜索(BFS)的方法。通过一个队列来遍历二叉树的每一层。对于每一层,计算其所有节点的值的和,并更新最深层叶子节点的和。当遍历完成时,最后一层即为最深层,其节点和即为所求。

时间复杂度:

O(n)

空间复杂度:

O(n)

代码细节讲解

🦆
如何确保宽度优先搜索(BFS)始终在遍历到最深层的叶子节点后停止,而不会提前结束?
宽度优先搜索(BFS)通过使用队列来管理节点的遍历顺序,确保按层次顺序访问每个节点。在算法中,只有当队列为空时,BFS才会停止。因为队列初始化时包含根节点,且在遍历过程中,只要节点有子节点就会被添加到队列中,这确保了只有在访问完所有层次后(即队列被清空时),BFS才会结束。因此,BFS能够保证在访问到树的最底层叶子节点之后才停止,不会提前结束。
🦆
在宽度优先搜索中,为何选择使用队列而不是其他数据结构如堆或栈?
在宽度优先搜索中使用队列是因为队列遵循先进先出(FIFO)原则,这对于层次遍历是必要的,以便按照从上到下、从左到右的顺序处理节点。如果使用栈(后进先出),则会变成深度优先搜索,改变遍历的顺序。使用堆(通常用于优先队列)在此场景中不适用,因为堆是根据元素优先级进行排序,而不是按插入顺序,这同样会破坏层次遍历的顺序。
🦆
算法中的`level_sum`变量在每一层的开始时为什么要重置为0?是否有可能在不重置的情况下计算最终结果?
在算法中,`level_sum`变量在每一层的开始时重置为0是为了单独计算每一层的节点值总和。这是因为我们需要找到最深层叶子节点的和,而这个和只与最后一层的节点相关。如果不重置`level_sum`,则它会累加所有层的节点值,这不仅会增加计算复杂性,还会导致结果错误,因为我们只需要最深层的节点和。因此,不重置`level_sum`将无法得到正确的最终结果。
🦆
在树的每一层遍历结束时,你是如何判断该层是否为最深层的叶子节点层?
在这个特定的算法实现中,我们并不是在每一层结束时判断该层是否为最深层,而是通过更新`deepest_sum`变量的值为当前层`level_sum`的值来处理。由于BFS总是从上到下遍历树的每一层,最后一次更新`deepest_sum`的操作实际上是在最底层进行的。因此,当队列为空,BFS结束时,`deepest_sum`保存的即是最深层叶子节点的和。

相关问题