一、 題目
給一個二叉樹,其中節點只可能是數字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; } };