问题描述
给定一个仅包含数字0-9的二叉树,每一条从根节点到叶子节点的路径都可以用一个数字表示。
例如根节点到叶子节点的一条路径是1->2->3,那么这条路径就用123来代替。
找出根节点到叶子节点的所有路径表示的数字之和
例如:
1↵ / ↵ 2 3
根节点到叶子节点的路径1->2用数字12代替
根节点到叶子节点的路径1->3用数字13代替
所以答案为12+13=25
解法
用栈深搜+回溯
深搜的时候*10,当到叶子节点时加入sum
搜索过程时将左右子树指针变为NULL,这样可以判度什么时候出栈。出栈时回溯/10
用一个vector记录判度出栈节点之前有没有被访问过,如果被访问过,就不能计算,直接出栈
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
int sumNumbers(TreeNode *root) {
stack<TreeNode*> s;
vector<TreeNode*>f;
int sum=0,temp=0;
if(root==NULL)return 0;
if(root->left==NULL && root->right==NULL)return root->val;
s.push(root);
while(!s.empty()){
TreeNode *t = s.top();
if(t->left==NULL && t->right==NULL){
if(find(f.begin(),f.end(),t)==f.end()){
temp*=10;
temp+=t->val;
sum+=temp;
}
temp/=10;
s.pop();
}
if(t->left!=NULL || t->right!=NULL){
temp*=10;
temp+=t->val;
f.push_back(t);
if(t->left!=NULL){
s.push(t->left);
t->left=NULL;
}
if(t->right!=NULL){
s.push(t->right);
t->right=NULL;
}
}
}
return sum;
}
};