129. Sum Root to Leaf Numbers

Given a binary tree containing digits from 0-9 only, each root-to-leaf path could represent a number.

An example is the root-to-leaf path 1->2->3 which represents the number 123.

Find the total sum of all root-to-leaf numbers.

Note: A leaf is a node with no children.

Example:

Input: [1,2,3]
    1
   / \
  2   3
Output: 25
Explanation:
The root-to-leaf path 1->2 represents the number 12.
The root-to-leaf path 1->3 represents the number 13.
Therefore, sum = 12 + 13 = 25.

Example 2:

Input: [4,9,0,5,1]
    4
   / \
  9   0
 / \
5   1
Output: 1026
Explanation:
The root-to-leaf path 4->9->5 represents the number 495.
The root-to-leaf path 4->9->1 represents the number 491.
The root-to-leaf path 4->0 represents the number 40.
Therefore, sum = 495 + 491 + 40 = 1026

Approach #1: C++.[recursive] 

 

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    int sumNumbers(TreeNode* root) {
        if (root == NULL) return 0;
        vector<string> sumRoot;
        helper(root, sumRoot, "");
        int ans = 0;
        for (string num : sumRoot)
            ans += stoi(num);
        return ans;
    }
    
private:
    void helper(TreeNode* root, vector<string>& sumRoot, string sum) {
        if (root == NULL) return;
        
        if (root->left == NULL && root->right == NULL) {
            sum = sum+to_string(root->val);
            sumRoot.push_back(sum);
            return;
        }
        
        helper(root->left, sumRoot, sum+to_string(root->val));
        helper(root->right, sumRoot, sum+to_string(root->val));
    }
};

  

 Approach #2: Java.[recursive]

 

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public int sumNumbers(TreeNode root) {
        return sum(root, 0);
    }
    
    private int sum(TreeNode root, int s) {
        if (root == null) return 0;
        if (root.left == null && root.right == null)
            return s*10 + root.val;
        return sum(root.left, s*10 + root.val) + sum(root.right, s*10 + root.val);
    }
}

  

 Approach #3: Python. [dfs+stack]

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution(object):
    def sumNumbers(self, root):
        """
        :type root: TreeNode
        :rtype: int
        """
        if not root:
            return 0
        res, stack = 0, [(root, root.val)]
        while stack:
            node, value = stack.pop()
            if node:
                if not node.left and not node.right:
                    res += value
                if node.left:
                    stack.append((node.left, value*10 + node.left.val))
                if node.right:
                    stack.append((node.right, value*10 + node.right.val))  
        return res

  

 

posted @ 2018-12-10 17:15  Veritas_des_Liberty  阅读(194)  评论(0编辑  收藏  举报