题目:
解法:
第一种做法:最容易想到的方法,双递归,先序遍历的变式,把每个遍历到的节点当作root(起点)进行搜索。
1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode(int x) : val(x), left(NULL), right(NULL) {} 8 * }; 9 */ 10 class Solution { 11 public: 12 int helper(TreeNode* root, int sum) 13 { 14 if (root== NULL) 15 { 16 return 0; 17 } 18 19 sum -= root->val; 20 21 return (sum==0?1:0) + helper(root->left, sum) + helper(root->right, sum); 22 } 23 int pathSum(TreeNode* root, int sum) 24 { 25 if (root == NULL) 26 { 27 return 0; 28 } 29 return helper(root, sum) + pathSum(root->left, sum) + pathSum(root->right, sum); 30 } 31 };
第二种方法:
第二种方法,单递归,也是先序遍历的变式,不过搜索方式改变为,把每个遍历到的节点当作终点(路径必须包含终点),记录根到终点的路径,从路径往前搜索这里需要注意的是:递归栈会保存每次递归的变量,所以可以用一个vector来保存路径,每次递归的过程都取相应的路径,因此递归返回后,要进行弹出。如果这里不理解的话,可以看第三种方法,第三种方法就是第二种方法的非递归形式。
1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode(int x) : val(x), left(NULL), right(NULL) {} 8 * }; 9 */ 10 class Solution { 11 public: 12 int helper(TreeNode* root, int sum, vector<int>& path) 13 { 14 if (root == NULL) 15 return 0; 16 17 path.push_back(root->val); 18 19 int sum_cur = 0; 20 int res = 0; 21 for (int i= path.size()-1; i>=0; i--) 22 { 23 sum_cur+= path[i]; 24 if (sum_cur == sum) 25 ++res; 26 } 27 res += helper(root->left, sum, path) + helper(root->right, sum, path); 28 path.pop_back(); 29 return res; 30 } 31 int pathSum(TreeNode* root, int sum) 32 { 33 vector<int> path; 34 return helper(root, sum, path); 35 } 36 37 };