持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第3天,点击查看活动详情
说明:文章部分内容及图片出自网络,如有侵权请与我本人联系(主页有公众号:小攻城狮学前端)
作者:小只前端攻城狮、 主页:小只前端攻城狮的主页、 来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
【LeetCode129. 求根节点到叶节点数字之和 】- JavaScript(先序遍历)
题目描述
给你一个二叉树的根节点 root ,树中每个节点都存放有一个 0 到 9 之间的数字。 每条从根节点到叶节点的路径都代表一个数字:
- 例如,从根节点到叶节点的路径 1 -> 2 -> 3 表示数字 123 。
计算从根节点到叶节点生成的 所有数字之和 。
叶节点 是指没有子节点的节点。
示例 1:
输入:root = [1,2,3] 输出:25 解释: 从根到叶子节点路径 1->2 代表数字 12 从根到叶子节点路径 1->3 代表数字 13 因此,数字总和 = 12 + 13 = 25
先序遍历
思路分析:
整体的的思路:分析完这个题目发现这里实际考察的就是按要求从根节点走到叶子节点,而所谓的数字相加只是一种形式。那我们可以利用递归和前序遍历来解题。定义sum(sumNumbers的返回值)和temp,通过判断节点是否为叶子节点来对sum进行加操作,这里利用js的闭包,可以将sum在递归的过程中保持值的不变。具体步骤如下:
- 首先先判断root为空,如果空就return了。
- 如果root为叶子节点,那我们可以对sum进行增加(这里利用闭包,保持sum变量的唯一
- 如果root不为叶子节点且不为空,读取左子树和右子树,进行递归遍历。
var sumNumbers = function(root) {
const visit=function(root,temp){
if(!root){
return
}
if(!root.left&&!root.right){
sum += temp*10+root.val
}
visit(root.left,temp*10+root.val)
visit(root.right,temp*10+root.val)
}
let sum = 0
let temp = 0
visit(root,temp)
return sum
};
思考
注意点:这里有个小技巧,题目解题过程中需要涉及到大量的计算,为了避免重复计算,我们需要记录每个节点所组成的数字,那么如何求得数字最方便最快。一个规律:
父节点组成的数字*10+当前节点的值
感谢阅读,希望能对你有所帮助,文章若有错误或者侵权,可以在评论区留言或在我的主页添加公众号联系我。
写作不易,如果觉得不错,可以「点赞」+「评论」 谢谢支持❤