【leetcode】129. 求根节点到叶节点数字之和

49 阅读1分钟

leetcode-129.png

这也是一道比较典型的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为树的高度