这也是一道比较典型的DFS题目,深度遍历记录其中信息,最后按要求给交付即可,这里的交付是求和。
递归
递归1
这里的思路很清晰,使用currentNum来记录每一轮的值,然后遇到叶子结点就累加sum,再return即可。
最最重要的是在dfs里面来记录信息,也就是第二个参数。
var sumNumbers = function (root) {
let sum = 0
var dfs = function (node, currentNum) {
currentNum = currentNum * 10 + node.val
if (!node.left && !node.right) {
sum += currentNum
return
}
if (node.left) dfs(node.left, currentNum)
if (node.right) dfs(node.right, currentNum)
}
dfs(root, 0)
return sum
};
递归2
这里就省去了一个sum的变量,判断空节点的时候是直接return 0。思路都差不多。
var sumNumbers = function (root) {
var dfs = function (node, currentNum) {
if (!node) return 0
currentNum = currentNum * 10 + node.val
if (!node.left && !node.right) {
return currentNum
}
return dfs(node.left, currentNum) + dfs(node.right, currentNum)
}
return dfs(root, 0)
};
非递归
var sumNumbers = function (root) {
if (!root) return 0
let stack = [{ node: root, currentNum: 0 }]
let sum = 0
while (stack.length) {
let { node, currentNum } = stack.pop()
currentNum = currentNum * 10 + node.val
if (!node.left && !node.right) {
sum += currentNum
}
if (node.right) stack.push({ node: node.right, currentNum })
if (node.left) stack.push({ node: node.left, currentNum })
}
return sum
};
时间复杂度:O(n),每个节点访问一次
空间复杂度:O(h),递归栈的深度,h为树的高度