题目描述
给定一个仅包含数字 0−9 的二叉树,每一条从根节点到叶子节点的路径都可以用一个数字表示。
例如根节点到叶子节点的一条路径是 1→2→3,那么这条路径就用 123 来代替。
找出根节点到叶子节点的所有路径表示的数字之和
解题思路
这道题要求所有路径的和,那么首先想到使用dfs遍历出所有的从根节点到叶子节点的路径,注意边界情况,每次使用一个临时数组存入已经到达的节点的val,当然每次遍历完一个节点的子节点之后要将当前值pop出来,将所有的路径经过的节点的val存入数组中,到达叶子节点后再插入res中,那么最终会得到一个二维数组res。
最后将res中每一行做一个十进制的累加运算,将这些运算结果相加即可。
代码如下,很简洁。
C++
/**
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
class Solution {
public:
vector<vector<int>> res;
/**
*
* @param root TreeNode类
* @return int整型
*/
int sumNumbers(TreeNode* root) {
if(root==nullptr) return 0;
// 临时保存当前路径经过的节点的值
vector<int> t;
addSum(t,root);
int sum = 0;
// 对二维数组求和
for(auto i: res){
// 对每一行求和
sum+=calSum(i);
}
return sum;
}
int calSum(vector<int> v){
int res=0;
for(int i=0;i<v.size();i++){
res = res*10+v[i];
}
return res;
}
void addSum(vector<int> temp, TreeNode* root){
if(root==nullptr) return;
temp.push_back(root->val);
if(root->left==nullptr&&root->right==nullptr){
res.push_back(temp);
}
if(root->left) addSum(temp, root->left);
if(root->right) addSum(temp, root->right);
temp.pop_back();
}
}; 
京公网安备 11010502036488号