【算法-LeetCode】129. 求根节点到叶节点数字之和(递归;回溯)

LeetCode129. 求根节点到叶节点数字之和

发布:2021年7月21日16:53:39

问题描述及示例

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

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

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sum-root-to-leaf-numbers
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

示例 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

我的题解

总体思路比较粗暴,就是把树里的所有路径都找出来(以数组的形式保存某一条路径),并将所有路径存储在数组paths数组中(所以paths是存储数组的数组)。然后再对paths中的所有路径逐一拼串获得该条路径所代表的数字,最后对这些数字求和并返回结果sum。最大的阻碍点就是递归调用时传入的第二个参数,还有针对LeetCode进行用例测试时的机制,应该手动将全局变量paths清空重置。

/**
 * 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}
 */
// 这个全局变量paths是用于存储所有路径的其中存储的单个元素即为一条路径。
// 注意和下面的path参数区分,此处paths必须被声明为全局变量来为getPaths函数提供服务,
let paths = [];
// getPaths作为辅助函数,用于获取一颗树的全部路径,
// root为根节点,path是一个数组,用于暂时存储一条完整的路径
let getPaths = function(root, path) {
	// 首先要保证root不为空,注意root不应该狭义的理解为我们一开始传入的【根节点】,
	// 因为下面用到了递归,所以解释为【当前节点】会更合适,
	// 当然要是root为空的话,最后应该返回0,所以下面的sum默认值为0
    if(root !== null) {
    	// 如果root不为空,则将当前节点的值存入path,
    	// 因为题目没有说明节点的val值是字符串类型还是数值类型,
    	// 以防出错,统一先转换为字符串以方便后续进行路径拼串
        path.push(String(root.val));
        // 判断当前节点是否为叶子节点,如果是的话,则说明已经找到了一条完整路径
        if(root.right === null && root.left === null) {
        	// 将当前找到的完整路径拼接为一个数字并转换为数值类型,并将该路径存入paths
            paths.push(Number(path.join('')));
        } else {
        	// 如果当前节点不是叶子节点,则运用递归的思想,
        	// 再次对当前节点的左右子节点调用getPaths函数,
        	// 注意下面的传入的关键的第二个参数[...path],这里用到了深拷贝和展开运算符
            getPaths(root.left, [...path]);
            getPaths(root.right, [...path]);
        }
    }
}

var sumNumbers = function(root) {
	// sum用于存储最后的求和结果,初始值为0是为了应对根节点为null的情况,
	// 同时应该注意不应该将sum声明为全局变量,否则的话在LeetCode中提交会出错。
    let sum = 0;
    // 调用getPaths获取树的全部路径
    getPaths(root, []);
    // 对paths中存储的所有路径代表的数字求和
    for(let i of paths) {
        sum += i;
    }
    // 注意此处一定要将paths清空,否则在LeetCode中提交会出错,
    // 因为paths必须被声明为全局变量来为getPaths函数服务,
    // 而LeetCode进行用例测试的时候并不会自动重置这个全局变量,所以我们要手动清空重置
    paths = [];
    return sum;
};


提交记录
108 / 108 个通过测试用例
状态:通过
执行用时: 60 ms,在所有 JavaScript 提交中击败了99.63%的用户
内存消耗: 39.1 MB,在所有 JavaScript 提交中击败了45.23%的用户
时间:202172116:59:27

官方题解

更新:2021年7月29日18:43:21

因为我考虑到著作权归属问题,所以【官方题解】部分我不再粘贴具体的代码了,可到下方的链接中查看。

更新:2021年7月29日19:58:33

参考:求根到叶子节点数字之和 - 求根节点到叶节点数字之和 - 力扣(LeetCode)

【更新结束】

有关参考

更新:2021年7月21日17:09:42
参考:【微信公众号:高级前端进阶 2021-06-13】适合初学者的树
参考:找出二叉树所有路径(多种方法)_世态炎凉!!的博客-CSDN博客_二叉树查找路径规则
参考:JavaScript for/in 语句 | 菜鸟教程
更新:2021年8月12日12:50:49
参考:展开语法 - JavaScript | MDN
更新:2021年8月12日13:55:57
参考:【微信公众号:代码随想录 2021-08-06】二叉树的所有路径:不止递归,还有回溯

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值