10.29 129.求根到叶子节点数字之和 难度:中等

题目描述:

给定一个二叉树,它的每个结点都存放一个 0-9 的数字,每条从根到叶子节点的路径都代表一个数字。

例如,从根到叶子节点路径 1->2->3 代表数字 123。

计算从根到叶子节点生成的所有数字之和。

说明: 叶子节点是指没有子节点的节点。

示例 1:

输入: [1,2,3]
    1
   / \
  2   3
输出: 25
解释:
从根到叶子节点路径 1->2 代表数字 12.
从根到叶子节点路径 1->3 代表数字 13.
因此,数字总和 = 12 + 13 = 25.
示例 2:

输入: [4,9,0,5,1]
    4
   / \
  9   0
 / \
5   1
输出: 1026
解释:
从根到叶子节点路径 4->9->5 代表数字 495.
从根到叶子节点路径 4->9->1 代表数字 491.
从根到叶子节点路径 4->0 代表数字 40.
因此,数字总和 = 495 + 491 + 40 = 1026.

思路:

遍历二叉树,当遍历到叶子节点后,将遍历得到的数字存进一个数组中,遍历完场,将数组中的数字加起来得出最后结果,这种方法因为要借助外部空间,空间复杂度较大

class Solution {
public:
    int sumNumbers(TreeNode* root) {
        if(!root) return 0;
        vector nums;
        pathNums(root,0,nums);
        int sum=0;
        for(int i=0;i& nums){
        if(!node) return; //可能传入非叶子节点的空节点 
        if(node->left == NULL && node->right == NULL) {
            num = num*10 + node->val;
            nums.push_back(num);
            return;
        }
        num = num*10 + node->val;
        pathNums(node->left,num,nums);
        pathNums(node->right,num,nums);
    }
};

代码优化:不利用外部空间 参考评论中的做法直接求sum,不对每个数字做存储后再求和

class Solution {
public:
    int sumNumbers(TreeNode* root) {
        if(!root) return 0;
        return pathNums(root,0);
    }

    int pathNums(TreeNode* node, int num){
        if(!node) return 0;
        if(node->left == NULL && node->right == NULL) {
            num += node->val;
            return num; //返回到叶子节点时的值
        }
        num += node->val; //求路径值
        return pathNums(node->left,num*10)+pathNums(node->right,num*10); //求和
    }
};

 

你可能感兴趣的:(LeetCode,刷题,dfs)