leetcode#129. 求根到叶子节点数字之和

题目链接

题目描述:

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

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

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

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

实例:
leetcode

解题思路

  与#257思路类似,套用先序遍历框架,将焦点移到对当前结点的操作和对传入参数对设置,剩下的交给递归。

  1. 判断当前结点是否为叶子结点。如果是,显然意味着一趟路径已然完成,将这一趟的路径和传给总数和sum。之后return回上一层(叶子结点的父结点),换路继续递归找出其与路径和(有回溯的思想在其中)。
  2. 既然有回溯的思想,那显然会出现状态重置的部分。而且根据本题题意,需要设置暂时存储的变量用于存储每一条路径和。对于该问题,可以通过添加辅助函数,扩展一个参数cur,用于暂时存储每一条路径和,然后在其传入参数的赋值部分,由于一开始就赋上当前结点的值,因此后面递归的赋值也要赋上左右子节点的值。注意:递归蕴含着栈的思想,每个结点,只有当与它相关的左右子树全部遍历完成才会返回它的父结点,也就是说返回之前它自己的cur是一直存在的。

乘10自增,执行用时:4ms

class Solution {
public:
    int sumNumbers(TreeNode* root) {
        if(!root)
            return sum;
        
        helper(root, root->val);   //提前赋值,后面递归的赋值也要相应改变
        return sum;
    }

    void helper(TreeNode* root, int cur){      //cur表示每一条路径和
        if(!root)
            return;
        
        if(!root->left && !root->right){
            sum += cur;
            return;
        }

        if(root->left)
            helper(root->left, cur * 10 + root->left->val);
        if(root->right)
            helper(root->right, cur * 10 + root->right->val);
        
        return;
    }

private:
    int sum = 0;    //记录所有和
};

### 字符串转int,执行用时:8ms
class Solution {
public:
    int sumNumbers(TreeNode* root) {
        if(!root)
            return sum;
        
        helper(root, to_string(root->val));
        return sum;
    }

    void helper(TreeNode* root, string cur){
        if(!root)
            return;
        
        if(!root->left && !root->right){
            //字符串转int
            stringstream ss;
            int curNum;
            ss << cur;
            ss >> curNum;

            sum += curNum;
            return;
        }

        if(root->left)
            helper(root->left, cur + to_string(root->left->val));
        if(root->right)
            helper(root->right, cur + to_string(root->right->val));
        
        return;
    }

private:
    int sum = 0;
};

如果有错误或者不严谨的地方,请务必给予指正,十分感谢。
本人blog:http://breadhunter.gitee.io

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值