题目描述
给定一个仅包含数字 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(); } };