想法:
可以利用广度优先搜索,找到所有的左leaf,并把它们加起来。
首先,利用collections库里的deque建立一个队列。使用deque是因为可以实现O(1)的效率。注意,这里deque的输入必须为一个iterable。
先把根放入队列。[root]。接着,利用deque的popleft() function把先进入队列的node取出来(队列是first in first out)。
然后,如果它有左节点就把左节点放入队列。同时,检查这个左节点是不是leaf,如果是就要计算和。如果它有右节点就把右节点放入队列。通过这样做,我们可以遍历树的每一层,实现广度优先搜索。
# 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
from collections import deque
class Solution:
def sumOfLeftLeaves(self, root: Optional[TreeNode]) -> int:
if not root.left and not root.right: return 0
q = deque([root])
res = 0
while q:
node = q.popleft()
if node.left:
q.append(node.left)
if not node.left.left and not node.left.right:
res += node.left.val
if node.right:
q.append(node.right)
return res