赞
踩
发布: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%的用户 时间:2021年7月21日16:59:27
更新:2021年7月29日18:43:21
因为我考虑到著作权归属问题,所以【官方题解】部分我不再粘贴具体的代码了,可到下方的链接中查看。
更新:2021年7月29日19:58:33
【更新结束】
更新: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】二叉树的所有路径:不止递归,还有回溯
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。