📜  二叉树最大深度处的节点总和(1)

📅  最后修改于: 2023-12-03 15:06:19.979000             🧑  作者: Mango

二叉树最大深度处的节点总和

介绍

给定一棵二叉树,找到最大深度处的所有节点的值的和。最大深度是从根节点到任意叶子节点的最长路径。

下面是一个示例二叉树:

        1
       / \
      2   3
     / \   \
    4   5   6
   / \
  7   8

最大深度处的节点是 5 和 6,它们的和是 11。

我们可以通过深度优先搜索来解决这个问题。具体地,我们从根节点开始进行深度优先搜索,记录每个节点所在的深度层次,同时记录最大深度 maxDepth,当遍历到第 maxDepth 层时,将此节点的值加入结果中。

解法
class Solution:
    def deepestLeavesSum(self, root: Optional[TreeNode]) -> int:
        if not root:
            return 0
        deep_sum = 0
        max_depth = 0

        def dfs(node, depth):
            nonlocal deep_sum, max_depth
            if not node:
                return
            if not node.left and not node.right:
                if depth > max_depth:
                    max_depth = depth
                    deep_sum = node.val
                elif depth == max_depth:
                    deep_sum += node.val
            dfs(node.left, depth + 1)
            dfs(node.right, depth + 1)

        dfs(root, 0)
        return deep_sum
思路

该解法使用了深度优先搜索(DFS)来遍历二叉树。在 DFS 的过程中,我们需要记录当前遍历到的节点深度 depth,以及最大深度 maxDepth 和最大深度处的节点的和 deepSum。在每次访问到叶子节点时,根据深度是否等于最大深度,更新 MaxDepth 和 DeepSum。

复杂度
  • 时间复杂度:O(n),n 为二叉树的节点数,需要遍历树中所有节点。
  • 空间复杂度:O(h),h 为树的高度,最坏情况下树是一棵斜树,需要存储 h 个递归栈帧。