【LeetCode】求根到叶子节点数字之和 每日一题 No.129 【拗口C++】

解题思路

记录一下:写了一个小时 真的太菜了

1、建立一个栈保存先序访问的值
2、当前访问的是空指针(我这里写的有点怪,当叶子节点指向其左节点,左边是空或者不是(左边空右边不是空[1,null,5])的情况进入)的时候就计算这一从根到叶子的序列之和
3、这里求和我写的是新建一个栈,把源栈倒到临时栈,再从临时栈倒到源栈 直接复制百度说好像要重载等于符号
4、维护这个栈,每进入一个子树出去的时候再把这个节点从栈中删除

菜鸡本我,一事无成,还望大佬批评教育,不吝指教!!!

代码

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    int num=0;
    void roo(TreeNode* &root,stack<int> &n){
        if(root==nullptr){  //【注意】这里写成root->left==nullptr&&root->right==nullptr直接判断是叶子在此代码下会少算回头看看大佬
            long long temp=0;
            stack<int> t;
            while(!n.empty()){
                t.push(n.top());
                n.pop();
            }
            int tag=t.size()-1;
            while(!t.empty()){
                temp+=t.top()*pow(10,tag--);
                n.push(t.top());
                t.pop();
            }
            //temp+=t.top()*pow(10,tag--);    //【注意】本来想把上面的t.empty()换成t.empty()==1然后上述代码总的删除一个栈顶
            //后来发现对示例二有漏洞 是每访问一个子树删除栈顶 不是每访问一个叶子结点删除一个栈顶
            //cout<<temp<<"#";
            num+=temp;
            return;
        }
        n.push(root->val);
        if(root->left!=nullptr||!(root->left==nullptr&&root->right!=nullptr)){  //这里只能在左边是空或者不是(左边空右边不是空[1,null,5])的情况进入
             roo(root->left,n);
        }
        if(root->right!=nullptr){  //思虑下这个写成root->left!=nullptr就错了 本质上与root->left没关系 还是思虑不周逻辑不清晰啊
            roo(root->right,n);
        }
        if(!n.empty()){
            n.pop();  //每访问完一个子树的根、左、右就删除一个栈顶根元素
            }
    }
    int sumNumbers(TreeNode* root) {
        stack<int>n;
        TreeNode* r=root;
        roo(r,n);
        return num;
    }
};

//代码来源:https://leetcode-cn.com/u/yy51930460/

算是原创第三篇博客 如果哥哥姐姐大佬们觉得有缘的话希望给在下点个赞赞 先谢谢可爱的同行咯

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值