从根到叶子的和 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.

For example,

    1
   / \
  2   3

The root-to-leaf path 1->2 represents the number 12.
The root-to-leaf path 1->3 represents the number 13.

Return the sum = 12 + 13 = 25.

思路:自底向上递归(类似于二叉树最大路径和 Binary Tree Max Path Sum)。每个内部节点会处在数条root-to-leaf的路径上,一个内部节点会有不同的power,这个内部节点的power是左子树和右子树的power乘以10。叶子节点的power是1。
代码如下:

    int sumNumbers(TreeNode *root) {
        int sum = 0;
        vector<int> power;
        sumNumbersUtil(root, power, sum);
        return sum;
    }
    
    void sumNumbersUtil(TreeNode* root, vector<int>& power, int& sum)
    {// utility function
     // sum: the sum up until now
     // power: the vector of powers of the root node
        if(root==NULL)
            return;
            
        vector<int>power1, power2;
        sumNumbersUtil(root->left, power1, sum);
        sumNumbersUtil(root->right, power2, sum);

	// combine the powers of left and right subtree        
        if(power1.size()>0)
        {
            for(int i=0; i<power1.size(); i++)
                power.push_back(10*power1[i]);
        }
        if(power2.size()>0)
        {
            for(int i=0; i<power2.size(); i++)
                power.push_back(10*power2[i]);
        }
        
	// root is a leaf node
        if(power1.size()==0 && power2.size()==0)
            power.push_back(1);
            
        for(int i=0; i<power.size(); i++)
        {
            sum = sum + root->val * power[i];
        }
            
    }


你可能感兴趣的:(从根到叶子的和 sum root to leaf numbers)