题目
给你一个二叉树的根节点 root ,树中每个节点都存放有一个 0 到 9 之间的数字。 每条从根节点到叶节点的路径都代表一个数字:
例如,从根节点到叶节点的路径 1 -> 2 -> 3 表示数字 123 。 计算从根节点到叶节点生成的 所有数字之和 。
叶节点 是指没有子节点的节点。
输入:root = [1,2,3] 输出:25 解释: 从根到叶子节点路径 1->2 代表数字 12 从根到叶子节点路径 1->3 代表数字 13 因此,数字总和 = 12 + 13 = 25
题目解析
思路一
我们这里先使用递归查询所有叶子节点组合的数字,由于每一步都存在左右有两个节点,因此每一层的返回结果都用数组保存,在上层接收的时候遍历一遍,将每串数字都加上前一位,最后累加上一步得到的数字
/** * @param {TreeNode} root * @return {number} */ var sumNumbers = function(root) { const getLeafVal = (node) => { let s = '' + node.val let res = [] if (node.left === null && node.right === null) { return [s] } if (node.left) { res = res.concat(getLeafVal(node.left).map(v => s + v)) } if (node.right) { res = res.concat(getLeafVal(node.right).map(v => s + v)) } return res } return getLeafVal(root).reduce((prev, cur) => prev + (cur - 0), 0) };
思路二
我们这里先判断一下数据是否为空,为空则直接退出,然后再定义一个存放每个节点的数组,在定义一个存放每个节点累加值的数组 ,累加值是指
节点的值+父节点值*10
,在声明一个变量用于存放累加结果,在进行初始化节点队列,头节点入队,初始化数值队列,头节点的值入队,在进行遍历,遍历的条件是队列不为空,在将对应的节点的值拿出队列,在进行判断若没有左右子节点,即为叶子节点,将该节点值累加,若有左节点,左节点与左节点的值入队,若有右节点,右节点与右节点的值入队
/** * @param {TreeNode} root * @return {number} */ var sumNumbers = function(root) { if (!root) return let nodes = [] let vals = [] let ans = 0 nodes.push(root) vals.push(root.val) while (nodes.length !== 0) { let node = nodes.shift() let val = vals.shift() if (!node.left && !node.right) { ans += val } if (node.left) { nodes.push(node.left) vals.push(node.left.val + 10 * val) } if (node.right) { nodes.push(node.right) vals.push(node.right.val + 10 * val) } } return ans }