给你一个二叉树的根节点 root ,树中每个节点都存放有一个 0 到 9 之间的数字。
每条从根节点到叶节点的路径都代表一个数字:
- 例如,从根节点到叶节点的路径
1 -> 2 -> 3表示数字123。
计算从根节点到叶节点生成的 所有数字之和 。
叶节点 是指没有子节点的节点。
初始解法
/**
* Definition for a binary tree node.
* class TreeNode {
* val: number
* left: TreeNode | null
* right: TreeNode | null
* constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
* }
*/
function sumNumbers(root: TreeNode | null): number {
function recursion(node:TreeNode,path:number[],sum:number){
//碰到叶子节点,开始求和
if(node !==null && node.left === null && node.right === null){
path.push(node.val)
const current_number = +path.reduce((acc,curr)=>acc + `${curr}`,'')
sum +=current_number
//加完了,然后直接 path-1,return
path.pop()
return sum
}
//非叶子节点:加入 path,然后递归左子树/右子树
let sum_left =0
let sum_right = 0
path.push(node.val)
if(node.left) {
sum_left = recursion(node.left,path,sum)
}
if(node.right){
sum_right = recursion(node.right,path,sum)
}
path.pop()
return sum_left+sum_right
}
const path = []
return recursion(root,path,0)
};最好解法:数学递归法
function sumNumbers(root: TreeNode | null): number {
function dfs(node:TreeNode,preSum){
let totalSum = 0
if(!node) return 0
let currSum = preSum * 10 + node.val
if(!node.left && !node.right) totalSum += currSum
if(node.left) totalSum += dfs(node.left,currSum)
if(node.right) totalSum +=dfs(node.right,currSum)
return totalSum
}
return dfs(root,0)
};