leetcode
leetcode 2951 ~ 3000
求根节点到叶节点数字之和

求根节点到叶节点数字之和

难度:

标签:

题目描述

English description is not available for the problem. Please switch to Chinese.

代码结果

运行时间: 23 ms, 内存: 16.1 MB


/*
 * 思路:
 * 我们可以使用递归和流来解决这个问题。
 * 通过使用递归遍历每个节点并将路径上的值累积起来。
 */

import java.util.stream.Stream;

class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;
    TreeNode(int x) { val = x; }
}

public class Solution {
    public int sumNumbers(TreeNode root) {
        return sumNumbers(root, 0);
    }

    private int sumNumbers(TreeNode node, int sum) {
        if (node == null) return 0;
        sum = sum * 10 + node.val;
        if (node.left == null && node.right == null) return sum;
        return Stream.of(node.left, node.right)
                .mapToInt(child -> sumNumbers(child, sum))
                .sum();
    }
}

解释

方法:

此题解使用深度优先搜索(DFS)算法来计算从根到叶子的所有路径数字之和。在递归过程中,我们将当前路径代表的数字作为参数传递到子节点。在每次递归调用中,我们先计算当前节点代表的数字,即将之前的数字乘以10并加上当前节点的值。如果当前节点是叶节点(即没有子节点),则返回当前的路径数字。如果不是叶节点,递归计算左右子节点,将结果相加得到总和。

时间复杂度:

O(n)

空间复杂度:

O(h)(h为树的高度)

代码细节讲解

🦆
在递归函数中,当遇到一个空节点`root == None`时,为什么返回0而不是其他值?
在递归函数中,当遇到一个空节点(即`root == None`)时,返回0是为了正确地计算总和。在二叉树的递归遍历中,空节点表示你已经到达了树的边界,没有更多的子节点可以继续遍历。返回0意味着这个方向上没有有效的路径贡献到最终的总和中,这是因为在递归中,父节点会将返回值加到其自身的路径和中。如果返回非0值,则会错误地将不存在的路径计入总和。
🦆
你是如何保证在每次递归调用时,当前路径代表的数字`curNum`正确计算的?请解释`preNum * 10 + root.val`这一步的逻辑。
每次递归调用时,`curNum`的计算是通过`preNum * 10 + root.val`来实现的。这里的`preNum`代表从根节点到当前节点的父节点的路径数字。将`preNum`乘以10是为了将`preNum`向左移动一个十进制位(即数字后面增加一个0),这样就为当前节点的值留出了个位空间。然后通过加上当前节点的值`root.val`,我们就能得到包括当前节点在内的完整路径数字。这个递归步骤保证了每一步都准确地构建出从根到当前节点的数字。
🦆
递归函数`dfs`在处理叶子节点时直接返回`curNum`,这样做有没有可能在某些特殊情况下错误地计算路径的总和?
在本题解的递归逻辑中,当`dfs`函数检测到叶子节点(即节点没有左右子节点)时,直接返回`curNum`是正确的处理方式。这是因为`curNum`此时代表了从根节点到叶子节点的完整路径数字。由于叶子节点是路径的终点,所以没有更多的子节点需要加入计算。返回`curNum`确保了这个路径数字正确地被计算并最终加入到总和中。没有特殊情况会导致这种处理方式错误地计算路径总和,只要所有的叶子节点都按此方式处理,总和的计算就会是正确的。

相关问题