I did it in almost the same way in C++ and I guess it cannot be optimized further. We have to visit each element once, atleast, and thats what our algorithm does.
Pasting my solution:
class Solution {
private:
void traverseAndSum(TreeNode *root, int &sum, int parSum);
public:
int sumNumbers(TreeNode *root) {
int sum = 0;
traverseAndSum(root, sum, 0);
return sum;
}
};
void Solution::traverseAndSum(TreeNode *root, int &sum, int parSum)
{
if (root == NULL)
return;
parSum = parSum * 10 + root->val;
if (root->left == NULL && root->right == NULL)
{
// Encountered a leaf node. Evaluate the sum
sum += parSum;
return;
}
traverseAndSum(root->left, sum, parSum);
traverseAndSum(root->right, sum, parSum);
}