题目简介:
给定一个二叉树,它的每个结点都存放一个 0-9
的数字,每条从根到叶子节点的路径都代表一个数字。
例如,从根到叶子节点路径 1->2->3
代表数字 123
。
计算从根到叶子节点生成的所有数字之和。
说明: 叶子节点是指没有子节点的节点。
示例 1:
1 2 3 4 5 6 7 8 9
| 输入: [1,2,3] 1 / \ 2 3 输出: 25 解释: 从根到叶子节点路径 1->2 代表数字 12. 从根到叶子节点路径 1->3 代表数字 13. 因此,数字总和 = 12 + 13 = 25.
|
示例 2:
1 2 3 4 5 6 7 8 9 10 11 12
| 输入: [4,9,0,5,1] 4 / \ 9 0 / \ 5 1 输出: 1026 解释: 从根到叶子节点路径 4->9->5 代表数字 495. 从根到叶子节点路径 4->9->1 代表数字 491. 从根到叶子节点路径 4->0 代表数字 40. 因此,数字总和 = 495 + 491 + 40 = 1026.
|
思路:
深搜+回溯的方法,定义一个数组来存储路径下的结点值,遇到叶子结点时则将数组中的结点值累加到结果中。
需要注意的是,在左右孩子非空的情况下才能进行相应的回溯。
tip:
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
|
class Solution { public:
int res = 0;
void add(vector<int>& nodes){
int sum = 0; int j = 0;
for(int i = nodes.size() - 1; i >= 0; i--){
sum = sum + nodes[i] * pow(10, j); j++; }
res += sum; }
void dfs(TreeNode* root, vector<int>& nodes){
if(!root) return;
nodes.push_back(root -> val); if(!root -> left && !root -> right){
add(nodes); return; }
if(root -> left){
dfs(root -> left, nodes); nodes.pop_back(); }
if(root -> right){
dfs(root -> right, nodes); nodes.pop_back(); }
}
int sumNumbers(TreeNode* root) {
vector<int> nodes;
dfs(root, nodes);
return res; } };
|
官方题解:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| class Solution { public: int dfs(TreeNode* root, int prevSum) { if (root == nullptr) { return 0; } int sum = prevSum * 10 + root->val; if (root->left == nullptr && root->right == nullptr) { return sum; } else { return dfs(root->left, sum) + dfs(root->right, sum); } } int sumNumbers(TreeNode* root) { return dfs(root, 0); } };
|