129. 求根到叶子节点数字之和
题目来源:力扣(LeetCode)https://leetcode-cn.com/problems/sum-root-to-leaf-numbers/
题目
给定一个二叉树,它的每个结点都存放一个 0-9
的数字,每条从根到叶子节点的路径都代表一个数字。
例如,从根到叶子节点路径 1->2->3
代表数字 123
。
计算从根到叶子节点生成的所有数字之和。
说明: 叶子节点是指没有子节点的节点。
示例 1:
输入: [1,2,3]
1
/ \
2 3
输出: 25
解释:
从根到叶子节点路径 1->2 代表数字 12.
从根到叶子节点路径 1->3 代表数字 13.
因此,数字总和 = 12 + 13 = 25.
示例 2:
输入: [4,9,0,5,1]
4
/ \
9 0
/ \
5 1
输出: 1026
解释:
从根到叶子节点路径 4->9->5 代表数字 495.
从根到叶子节点路径 4->9->1 代表数字 491.
从根到叶子节点路径 4->0 代表数字 40.
因此,数字总和 = 495 + 491 + 40 = 1026.
解题思路
思路:深度优先搜索
在这里,题目中说明,每条从根到叶子节点的路径都代表一个数字。
直接看题目给出的例子,1->2->3
代表数字 123
。
现在题目要求的就是所有这样生成的数字之和。
这里主要说一下,根到叶子节点的路径是如何生成一个数字?
还是以上面的例子说明:
1->2->3
要得到 123
这个数字,可以是:
1 * 100 + 2 * 10 + 3
再提取结合,可以是:
1 * 10 + 2 -> 12
12 * 10 + 3 -> 123
上面的式子当中,我们计算的 23
,123
,这两个数字分别对应的是根节点到节点 2
以及根节点到节点 2
再到节点 3
的生成的数字。
也就是要计算根节点到当前节点生成的数字,要先知道根到父节点所生产的数字。
那么对于根节点而已,我们可以这样处理,假设根节点的父节点所产生的数字为 0,那么单独根节点生成的数字则为:
0 * 10 + 1 -> 1
我们可以发现,从根节点开始往下遍历的时候,可以边计算边遍历。
那么现在用深度优先搜索的方法进行实现,具体的做法如下:
- 从根节点开始往下遍历,对遇到的节点进行处理:
- 如果是叶子节点,那么将叶子节点的数进行计算;
- 如果不是叶子节点,那么计算节点数后,再继续递归。
具体的代码实现如下。
# 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:
def dfs(root, pre_node_val):
"""
Args:
root: 节点
pre_node_val:父节点生成的数字
"""
if not root:
return 0
# 计算根到当前节点生成的数
# 根到父节点生成的数 * 10 + 当前节点的值
total = pre_node_val * 10 + root.val
# 如果当前节点是叶子节点,将计算后的值返回
if not root.left and not root.right:
return total
# 否则继续递归
else:
return dfs(root.left, total) + dfs(root.right, total)
# 默认根节点的父节点生成的数字为 0
pre_node_val = 0
return dfs(root, pre_node_val)
欢迎关注
公众号 【书所集录】
如有错误,烦请指出,欢迎指点交流。