解题思路
记录一下:写了一个小时 真的太菜了
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/
算是原创第三篇博客 如果哥哥姐姐大佬们觉得有缘的话希望给在下点个赞赞 先谢谢可爱的同行咯