题目
给你一个二叉树的根节点 root ,树中每个节点都存放有一个 0 到 9 之间的数字。 每条从根节点到叶节点的路径都代表一个数字:
例如,从根节点到叶节点的路径 1 -> 2 -> 3 表示数字 123 。 计算从根节点到叶节点生成的 所有数字之和 。
叶节点 是指没有子节点的节点。
示例 1:
输入:root = \[1,2,3]
输出:25
解释:
从根到叶子节点路径 1->2 代表数字 12
从根到叶子节点路径 1->3 代表数字 13
因此,数字总和 = 12 + 13 = 25
示例 2:
输入:root = \[4,9,0,5,1]
输出:1026
解释:
从根到叶子节点路径 4->9->5 代表数字 495
从根到叶子节点路径 4->9->1 代表数字 491
从根到叶子节点路径 4->0 代表数字 40
因此,数字总和 = 495 + 491 + 40 = 1026
思路
本题可以采用深度优先搜索(DFS)来实现。具体思路是遍历整棵树,在遍历时维护当前路径上的数字串,当遍历到叶子节点时,将当前路径所代表的数字添加到结果集中。
代码如下:
function sumNumbers(root: TreeNode | null): number {
let res: number = 0
if (!root) return res
const traversal = (node: TreeNode | null, path: string) => {
if (!node) return
path += node.val.toString()
if (!node.left && !node.right) {
res += parseInt(path)
} else {
traversal(node.left, path)
traversal(node.right, path)
}
}
traversal(root, '')
return res
}
复杂度分析
-
时间复杂度:O(n),其中 n 是二叉树中的节点数。在最坏情况下,需要遍历二叉树中的所有路径,因此时间复杂度为 O(n)。
-
空间复杂度:O(n),空间复杂度取决于递归的深度,而树最坏情况下为链状,因此空间复杂度为 O(n)。