这个题目有个细节没注意,改了 之后才OK,开始没考虑右子树也需要pop的问题。

/**
 * struct TreeNode {
 *	int val;
 *	struct TreeNode *left;
 *	struct TreeNode *right;
 * };
 */

class Solution {
public:
    /**
     * 
     * @param root TreeNode类 
     * @return int整型
     */
    
    int res = 0;
    int sumNumbers(TreeNode* root) {
        // write code here
       if(root == NULL){
           return 0;
       } 
       
       vector<int> path;
       sumNumbersWithPath(root, path);
//        printf("res = %d\n",res);
       return res;
    }
    
    void sumNumbersWithPath(TreeNode* root,vector<int> &path) {
        // write code here
       if(root == NULL){
           return;
       } 
       
       path.push_back(root->val);
       if(root->left == NULL && root->right == NULL){
           int val = 0;
           for(int i=0;i<path.size();i++){
               val *= 10;
               val += path[i];
//                printf("path[%d] = %d",i,path[i]);
           }
//            printf("\n");
//            printf("val = %d\n",val);
           res += val;
           return;
       }
        
       if(root->left != NULL){
           sumNumbersWithPath(root->left,path);
           path.pop_back();
       }
        
        if(root->right != NULL){
           sumNumbersWithPath(root->right,path);
           path.pop_back();
       }
       return;
    }
};


简化版本:
这个妙在如果root为空返回0,不参加计算这个上面。
细细品味。。

class Solution {
public:
    /**
     * 
     * @param root TreeNode类 
     * @return int整型
     */
    
    int sumNumbers(TreeNode* root) {
        // write code here
       return dfs(root,0);
    }
    
    int dfs(TreeNode* root,int val) {
        // write code here
       if(root == NULL){
           return 0;
       } 
       
       val = root->val + val * 10;
       if(root->left == NULL && root->right == NULL){
           return val;
       }

       return dfs(root->left,val) + dfs(root->right,val);
    }
};