class Solution {
public:
int sumNumbers(TreeNode* root) {
if (root == nullptr) return 0;
deque<TreeNode*> nodes;
nodes.emplace_back(root);
deque<int> vals;
vals.emplace_back(root->val);
int sum;
while (!nodes.empty()) {
int n = nodes.size();
for (int i = 0; i != n; ++i) {
TreeNode* node = nodes.front();
int val = vals.front();
if (node->left != nullptr) {
nodes.emplace_back(node->left);
vals.emplace_back(val*10 + node->left->val);
}
if (node->right != nullptr) {
nodes.emplace_back(node->right);
vals.emplace_back(val*10 + node->right->val);
}
nodes.pop_front();
vals.pop_front();
if (node->right == nullptr && node->left == nullptr)
sum += val;
}
}
return sum;
}
};
/**
* 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 sumNumbers(TreeNode* root) {
if (root == nullptr) return 0;
int sum = 0;
reSolver(root, 0, sum);
return sum;
}
private:
void reSolver(TreeNode* root, int ans, int& sum) {
ans += root->val;
if (root->left != nullptr)
reSolver(root->left, ans * 10, sum);
if (root->right != nullptr)
reSolver(root->right, ans * 10, sum);
if (root->right == nullptr && root->left == nullptr)
sum += ans;
}
};
class Solution {
public:
int sumNumbers(TreeNode* root) {
if (root == nullptr) return 0;
using TUPLE = tuple<TreeNode*, int>;
stack<TUPLE> s;
int sum = 0;
int topVal = 0;
TreeNode* node = root;
while (!s.empty() || node != nullptr) {
if (node == nullptr) {
auto t = s.top();
node = get<0>(t);
topVal = get<1>(t);
s.pop();
if (node->left == nullptr && node->right == nullptr)
sum += topVal;
node = node->right;
} else {
topVal = topVal * 10 + node->val;
s.push(TUPLE(node, topVal));
node = node->left;
}
}
return sum;
}
};