一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第13天,点击查看活动详情。
一、题目描述
给你一个二叉树的根节点 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
提示:
- 树中节点的数目在范围
[1, 1000]内 0 <= Node.val <= 9- 树的深度不超过
10
二、思路分析
要获取所有路径数字之和,很简单,递归遍历一遍二叉树,沿路记录下来路径上的数字,到叶子节点的时候求和,这就完事了。
注意一点:每条路径之和,不是整数类型的相加,而是字符串类型的相加,这就意味着需要定义一个字符串类型变量 str ,用来标识路径和;需要定义一个整数类型的变量 res ,用来加上转化为整数类型的 str 。
那么什么时候记录 str ,res 在又在什么时候加上 str 呢?
str要记录路径节点值,那肯定是在前序遍历的地方进行记录;- 在某一条路径遍历到叶子节点时,
res就可以加上转化后的str。
注意:路径遍历完之后,要更换路径,那么 str 就需要改变,如两条有重叠的路径,需要砍掉最后一个节点,而字符串要删除最后一个节点,可以使用 substring 方法,在后序遍历的位置删除即可。
三、AC 代码
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {TreeNode} root
* @return {number}
*/
var sumNumbers = function(root) {
let res = 0;
let str = '';
const dfs = (node) => {
if (!node) {
return;
}
str += node.val;
if (!node.left && !node.right) {
res += str - '0';
}
dfs(node.left);
dfs(node.right);
str = str.substring(0, str.length - 1);
}
dfs(root);
return res;
};