import java.util.*;

public class Solution {
    public int sumNumbers (TreeNode root) {
        // 预处理
        if (root == null) return 0;
        if (isLeaf(root)) return root.val;

        // 返回所有路径的和
        return getAllPathSum(root.left,root.val) + getAllPathSum(root.right,root.val);
    }

    // 深度优先搜索
    public int getAllPathSum(TreeNode root, int fatherVal) {
        // 预处理
        if (root == null) return 0;
        if (isLeaf(root)) return 10 * fatherVal + root.val;

        // 更新路径在当前结点时的值
        int curVal = fatherVal * 10 + root.val;
        // 递归求左右子树的路径和
        return getAllPathSum(root.left,curVal) + getAllPathSum(root.right,curVal);   
    }

    // 判断当前结点是否为叶子结点
    public static boolean isLeaf(TreeNode node) {
        // 预处理
        if (node == null) return false;
        // 若当前结点没有子结点,则其为叶子结点
        return node.left == null && node.right == null;
    }
}