1302-deepest-leaves-sum¶
Try it on leetcode
Description¶
Given the
root
of a binary tree, return the sum of values of its deepest leaves.
Example 1:

Input: root = [1,2,3,4,5,null,6,7,null,null,null,null,8] Output: 15
Example 2:
Input: root = [6,7,8,2,7,1,3,9,null,1,4,null,null,null,5] Output: 19
Constraints:
- The number of nodes in the tree is in the range
[1, 104]
. 1 <= Node.val <= 100
Solution(Python)¶
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def deepestLeavesSum(self, root: Optional[TreeNode]) -> int:
return self.morristraversal(root)
# Time Complexity: O(n)
# Space Complexity: O(h)
def dfs(self, root: Optional[TreeNode]) -> int:
def lendfs(node):
if node:
left = lendfs(node.left)
right = lendfs(node.right)
return max(left, right) + 1
return 0
length = lendfs(root)
maxsum = 0
def calcSum(node, depth):
nonlocal maxsum
if not node:
return
if depth == 1 and not node.left and not node.right:
maxsum += node.val
calcSum(node.left, depth - 1)
calcSum(node.right, depth - 1)
calcSum(root, length)
return maxsum
# Time Complexity: O(n)
# Space Complexity: O(h)
def bfs(self, root: Optional[TreeNode]) -> int:
q = deque([root])
cursum = 0
while q:
cursum = 0
qsize = len(q)
for i in range(qsize):
p = q.popleft()
cursum += p.val
if p.left:
q.append(p.left)
if p.right:
q.append(p.right)
return cursum
# Time Complexity: O(n)
# Space Complexity: O(h)
def singledfs(self, root: Optional[TreeNode]) -> int:
maxsum = 0
maxlevel = 0
def dfs(node, level):
nonlocal maxsum, maxlevel
if not node:
return
if level > maxlevel:
maxsum = node.val
maxlevel = level
elif level == maxlevel:
maxsum += node.val
dfs(node.left, level + 1)
dfs(node.right, level + 1)
dfs(root, 0)
return maxsum
# Time Complexity: O(n)
# Space Complexity: O(1)
def morristraversal(self, root: Optional[TreeNode]) -> int:
def morris(node):
depth = 0
while node:
if not node.left:
yield node.val, depth
node = node.right
depth += 1
else:
prev = node.left
down = 1
while prev.right not in (None, node):
prev = prev.right
down += 1
if prev.right:
prev.right = None
depth -= down + 1
yield node.val, depth
node = node.right
depth += 1
else:
prev.right = node
node = node.left
depth += 1
maxDepth = max(depth for _, depth in morris(root))
return sum(val for val, depth in morris(root) if depth == maxDepth)