【前端面试常见算法题系列】129. 求根节点到叶节点数字之和(中等)

177 阅读1分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第13天,点击查看活动详情

一、题目描述

给你一个二叉树的根节点 root ,树中每个节点都存放有一个 09 之间的数字。 每条从根节点到叶节点的路径都代表一个数字:

  • 例如,从根节点到叶节点的路径 1 -> 2 -> 3 表示数字 123 。 计算从根节点到叶节点生成的 所有数字之和

叶节点 是指没有子节点的节点。

示例 1: image.png

输入:root = [1,2,3]
输出:25
解释:
从根到叶子节点路径 1->2 代表数字 12
从根到叶子节点路径 1->3 代表数字 13
因此,数字总和 = 12 + 13 = 25

示例 2: image.png

输入: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

那么什么时候记录 strres 在又在什么时候加上 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;
};