# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def sumNumbers(self, root: TreeNode) -> int:
if not root:
return 0
#方法1
def dfs(root, prevTotal) -> int:
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
tmp = []
total = 0
def helper(root):
nonlocal tmp,total
if not root:
return
val = root.val
tmp.append(str(root.val))
if not root.left and not root.right:
total+=int(''.join(tmp))
helper(root.left)
helper(root.right)
tmp.pop()
helper(root)
return total
这个题目还有一个变形,就是找到所有从根节点到叶子节点的路径或者求出路径的和。这个类型的题目都是采用递归的方法去操作的,这个题目也同理是这样。
- 方法1
- 原理比较简单,什么时候会停止递归那就是遇到叶子节点的时候会停止递归
- 利用total来保存当前节点的计算结果
- 如果当前节点是叶子节点就直接返回该值
- 如果不是叶子节点那就递归的遍历左右两个子树,而且把total当作上一个节点的值参与计算
- 方法2
- 先序遍历的一个改动
- 把遍历到的数据加到tmp数组中,当节点是叶子节点的时候就把这一个支路的值加和
- 每一个节点左右子树都遍历结束的时候,数组执行pop操作然后观察上一节点的支路情况
总结:就是递归的一个应用,在考虑递归问题的时候最好把它最简单话,写一个最基本的二叉树,然后就比较好想了。