• 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
    

      

    永远渴望,大智若愚(stay hungry, stay foolish)
  • 相关阅读:
    看动画轻松理解「递归」与「动态规划」
    21天,在Github上获取 6300 star
    啥是佩奇排名算法
    什么是平衡二叉树(AVL)
    看完动画你还会不懂 快速排序么
    冰与火之歌:「时间」与「空间」复杂度
    21天,在Github上获取 6300 star
    看完动画你还会不懂 快速排序么
    五分钟学会一个有意思的排序:计数排序
    十大经典排序算法动画,看我就够了!
  • 原文地址:https://www.cnblogs.com/h-hkai/p/10097593.html
Copyright © 2020-2023  润新知