DFS遍历,遇到叶子节点则结束并回溯,并将当前值加到总值里面。时间O(n),空间O(logN)。
class Solution {
public:
int sumNumbers(TreeNode *root) {
int sum = 0;
int cur = 0;
dfs(root, sum, cur);
return sum;
}
void dfs(TreeNode *root, int &sum, int &cur)
{
if(root == NULL) return;
cur = cur*10+root->val;
if(root->left == NULL && root->right == NULL)
sum += cur;
if(root->left) dfs(root->left, sum, cur);
if(root->right) dfs(root->right, sum, cur);
cur = cur/10;
}
};
Method 2: 使用stack进行迭代遍历。http://blog.csdn.net/starmsg/article/details/39030379
class Solution {
public:
int sumNumbers(TreeNode *root) {
if(root == NULL) return 0;
vector<TreeNode*> s;
TreeNode *p = root;
TreeNode *prev = NULL;
int num=0, sum=0;
while(p != NULL || !s.empty())
{
if(p != NULL)
{
s.push_back(p);
num = num*10 + p->val;
p = p->left;
}
else {
p = s.back();
if (p->right == NULL || p->right == prev) {
if(p->left == NULL && p->right == NULL)
sum += num;
num = num/10;
s.pop_back();
prev = p;
p = NULL;
} else {
p = p->right;
}
}
}
return sum;
}
};