题目链接: https://leetcode-cn.com/problems/deepest-leaves-sum/.
这道题很明显是对于树的层序遍历。
解法一:
class Solution(object):
def deepestLeavesSum(self, root):
"""
:type root: TreeNode
:rtype: int
"""
if not root:
return 0
val_depth = []
self.help(root, val_depth, 0)
max_depth = max([ele[1] for ele in val_depth])
return sum([ele[0] for ele in val_depth if ele[1] == max_depth])
def help(self, node, result, depth):
if not node:
return
result.append((node.val, depth))
self.help(node.left, result, depth + 1)
self.help(node.right, result, depth + 1)
解法一的短板很明显,通过DFS记录每一个节点的值和层信息,最后计算层数最大的叶子节点的值的和。
其需要遍历多次,且空间复杂度为O(n)
解法二:
class Solution(object):
max_depth = 0
result_sum = 0
def deepestLeavesSum(self, root):
"""
:type root: TreeNode
:rtype: int
"""
if not root:
return 0
self.help(root, 0)
return self.result_sum
def help(self, node, depth):
if not node:
return
if not node.left and not node.right: #最底层的节点肯定是leaf
if self.max_depth == depth:
self.result_sum += node.val
elif self.max_depth < depth:
self.max_depth = depth
self.result_sum = node.val #清空之前记录的和
else:
self.help(node.left, depth + 1)
self.help(node.right, depth + 1)
解法二通过变量记录"max_depth"和max_depth的和,因为只有Leaf节点可能为层数最深,所以当遍历到Leaf时,我们对于max_depth, result_sum进行更新。