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<int> nums;
        pathNums(root,0,nums);
        int sum=0;
        for(int i=0;i<nums.size();++i){
            sum += nums[i];
        }
        return sum;
    }
    void pathNums(TreeNode* node, int num, vector<int>& 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); //求和
    }
};

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值