【树】437. 路径总和 III

题目:

解法:

第一种做法:最容易想到的方法,双递归,先序遍历的变式,把每个遍历到的节点当作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 };

猜你喜欢

转载自www.cnblogs.com/ocpc/p/12821427.html