一、 题目
给一个二叉树,其中节点只可能是数字0-9,每一条路径组成一个数。
如下:
1
/ \
2 3
左边路径1->2 代表 12.
右边路径1->3 代表 13.
sum = 12 + 13 = 25.
二、 分析
想起了一句话,树的问题可归结为递归问题,这道题也一样,每次经过一个节点会遇到三中情况:
1、不包含左/右节点;
2、普通节点,即拥有有效的左或右节点;
3、无效节点(NULL);
而这三种情况对应于递归实现中的三种不同的实现方式:
1、sum * 10 + root->val;
2、helper(root->left, sum * 10 + root-val) + helper(root->right, sum * 10 + root-val);
3、return 0
代码:
/**
* 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 helper(TreeNode *root, int sum){
if(root == NULL)
return 0;
if(root->left == NULL && root->right == NULL){
return (sum * 10 + root->val);
}
else {
return helper(root->left, sum * 10 + root->val) + helper(root->right, sum * 10 + root->val);
}
}
int sumNumbers(TreeNode *root) {
return helper(root, 0);
}
};
另一种思路是每当遇到一个叶子节点时就将当前的和加入到总和中,即sum和c_sum,直到遍历完所有的叶子节点。
如下:
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
void helper(TreeNode *root, int &sum, int c_sum){
if(root == NULL)
return ;
c_sum = c_sum * 10 + root->val;
helper(root->left, sum, c_sum);
helper(root->right, sum, c_sum);
if(root->left == NULL && root->right == NULL)
sum += c_sum;
}
int sumNumbers(TreeNode *root) {
int sum = 0;
helper(root, sum, 0);
return sum;
}
};