113. Path Sum II

https://leetcode.com/problems/path-sum-ii/

本题大意:给定一个二叉树和一个值sum,求出所有从根节点到叶子节点的路径,使得路径所通过的节点值之和为sum。

例如:给定二叉树:                  值为sum=22,所得结果应该为:

                             

解题思路:路径要满足的条件为:1、相加之和等于sum  2、最终应该到叶子结点。这两个也就是递归成功的返回条件。递归不成功的返回条件为:1、到达了叶子结点   2、但是相加之和不为sum。

本题是先序遍历的递归:肯定是先考察当前结点,然后递归左子树,再递归右子树。

注意:回溯问题。如果当前这颗子树的左右子树都遍历完了,那么应该回到它的父节点。

代码如下:

 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     vector<vector<int>> pathSum(TreeNode* root, long long sum) {
13         vector<int> v;
14         vector<vector<int> > path;
15         pathSumHelper(v, path, root, sum);
16         
17         return path;
18     }
19     
20     void pathSumHelper(vector<int> & v, vector<vector<int> > & path, TreeNode* root, long long sum)
21     {
22         if(!root) return;
23 
24         v.push_back(root->val);
25         int cur = sum - root->val;
26         if(!root->left && !root->right)
27         {
28             if(cur == 0)
29             {
30                 path.push_back(v);
31                 v.pop_back();
32                 return;
33             }
34             else
35             {
36                 v.pop_back();
37                 return;
38             }
39         }
40         pathSumHelper(v, path, root->left, cur);
41         pathSumHelper(v, path, root->right, cur);
42         v.pop_back();
43         return;
44     }
45 };

 

posted @ 2016-06-14 16:51  可爱的熊乖乖  阅读(435)  评论(0编辑  收藏  举报