/*
1.方案1 递归
采用路径和看成每个支路之和;
1)如果达到根节点将当前支路的和返回;
2)如果没有则需要将左右节点的和相加

2.方案2 dfs;
双向队列对每层数据进行存与读
保存层每个节点当前的数值;
如果当前节点的左右节点为空则直接加入;
没有则继续

/
/*

  • struct TreeNode {
  • int val;
  • struct TreeNode *left;
  • struct TreeNode *right;
  • };
  • /

class Solution {
public:
/*
*
* @param root TreeNode类
* @return int整型
/
//递归
// int tr(TreeNode
root,int sum)
// {
// if(!root) return 0;
// sum=sum*10+root->val;
// if(!root->left&&!root->right) return sum;
// return tr(root->left,sum)+tr(root->right,sum);
// }
// int sumNumbers(TreeNode
root) {
// // write code here
// return tr(root,0);

//dfs
int sumNumbers(TreeNode* root) {
    int Ans=0;
    //存储每条支路上的数值
    vector<int> ans;
    deque<TreeNode*>dq;
    if(root) {dq.push_back(root);ans.push_back(root->val);}
    while(!dq.empty())
    {
        vector<int>temp;
        int l=dq.size();
        for(int i=0;i<l;i++)
        {
            TreeNode* R=dq.front();
            dq.pop_front();
            if(R->left){
                dq.push_back(R->left);
                temp.push_back(ans[i]*10+R->left->val);//ans=temp;
            }
            if(R->right)
            {
                dq.push_back(R->right);
                temp.push_back(ans[i]*10+R->right->val);
                //ans=temp;
            }
            //当不存在左右节点是表明已经到达根节点直接叠加即可
            if(!R->left&&!R->right) Ans+=ans[i];

        }

// //如果使用当前层的数值更新之前的ans
if(!dq.empty())
ans=temp;
}

    return Ans;
 }

};