描述


给定一个二叉树的根节点 root ,树中每个节点都存放有一个 09 之间的数字。

每条从根节点到叶节点的路径都代表一个数字:

  • 例如,从根节点到叶节点的路径 1 -> 2 -> 3 表示数字 123

计算从根节点到叶节点生成的 所有数字之和
叶节点 是指没有子节点的节点。

示例

示例1:

num1tree.jpg

  1. 输入:root = [1,2,3]
  2. 输出:25
  3. 解释:
  4. 从根到叶子节点路径 1->2 代表数字 12
  5. 从根到叶子节点路径 1->3 代表数字 13
  6. 因此,数字总和 = 12 + 13 = 25

示例2:

num2tree.jpg

输入:root = [4,9,0,5,1]
输出:1026
解释:
从根到叶子节点路径 4->9->5 代表数字 495
从根到叶子节点路径 4->9->1 代表数字 491
从根到叶子节点路径 4->0 代表数字 40
因此,数字总和 = 495 + 491 + 40 = 1026

提示

  • 树中节点的数目在范围 [1, 1000]
  • 0 <= Node.val <= 9
  • 树的深度不超过 10

解题思路

DFS
fig1.png

  • 用 dfs 递归遍历树节点
  • 如果是叶子节点:先更新从根节点到叶子节点的数,然后将这个数加到最后结果 res 中。
  • 如果是非叶子节点:更新从根节点到当前节点的数,如果左子树非空,递归遍历左子树,如果右子树非空,递归遍历右子树。

代码

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    private int res;
    public int sumNumbers(TreeNode root) {
        res = 0;
        dfs(root, 0);
        return res;
    }
    private void dfs(TreeNode node, int tmp) {
        if (node.left == null && node.right == null) {
            res += (tmp * 10) + node.val;
            return;
        }
        if (node.left != null) {
            dfs(node.left, (tmp * 10) + node.val);
        }
        if (node.right != null) {
            dfs(node.right, (tmp * 10) + node.val);
        }
    }
}

官方题解代码


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

    public int dfs(TreeNode root, int prevSum) {
        if (root == null) {
            return 0;
        }
        int sum = prevSum * 10 + root.val;
        if (root.left == null && root.right == null) {
            return sum;
        } else {
            return dfs(root.left, sum) + dfs(root.right, sum);
        }
    }
}

复杂度分析

时间复杂度:O(n),其中 n 是二叉树的节点个数。对每个节点访问一次。

空间复杂度:O(n),其中 n 是二叉树的节点个数。空间复杂度主要取决于递归调用的栈空间,递归栈的深度等于二叉树的高度,最坏情况下,二叉树的高度等于节点个数,空间复杂度为 O(n)。