问题:
题目来源:力扣(LeetCode)
难度:中等
分析:
这是帮助理解递归非常有效的题,不理解递归的同学一定要好好看这道题的DFS解法。
用DFS和BFS都可以实现。
DFS的思路非常直接,求出每条路径的数字,然后相加。
BFS的思路是层数每深入一层,上层的值就需要多乘10,一直累加到最后一层。
解决方法:
1:DFS
#好好理解preTotal的作用,向下递归时,将参数带往子节点,用于求路径和;向上返回时将每个路径和依次相加,求得最终的总和。
class Solution:
def sumNumbers(self, root: TreeNode) -> int:
def dfs(root, prevTotal):
if not root: return 0
total = prevTotal * 10 + root.val
if not root.left and not root.right:
return total
else:
return dfs(root.left, total) + dfs(root.right, total)
return dfs(root, 0)
2:递归
BFS
#树每深入一层,上层的和就应该多乘10,层层递进直到最后一层。
class Solution:
def sumNumbers(self, root: TreeNode) -> int:
if not root:
return 0
total = 0
nodeQueue = collections.deque([root])
numQueue = collections.deque([root.val])
while nodeQueue:
node = nodeQueue.popleft()
num = numQueue.popleft()
left, right = node.left, node.right
if not left and not right:
total += num
else:
if left:
nodeQueue.append(left)
numQueue.append(num * 10 + left.val)
if right:
nodeQueue.append(right)
numQueue.append(num * 10 + right.val)
return total