leetcode113.路径总和II
给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。
说明: 叶子节点是指没有子节点的节点。
示例:
给定如下二叉树,以及目标和 sum = 22,
5
/ \
4 8
/ / \
11 13 4
/ \ / \
7 2 5 1
返回:
[
[5,4,11,2],
[5,8,4,5]
]
和112题不同的是要保存每条符合条件的路径,path实现上有两种方法,一种是作为成员变量,需要自己写回退的时机,另一种是作为参数值传递,当返回上一层时path数组自动恢复上一层的值。
方法一(path作为成员变量):
class Solution { vector<int> path; vector<vector<int>> res; public: vector<vector<int>> pathSum(TreeNode* root, int sum) { if(!root) return res; findpath(root, sum); return res; } void findpath(TreeNode *root, int sum) { if(!root->left && !root->right && root->val == sum) { path.push_back(root->val); res.push_back(path); path.pop_back(); return; } if(!root->left && !root->right) return; //非叶节点 path.push_back(root->val); if(root->left) findpath(root->left, sum - root->val); if(root->right) findpath(root->right, sum - root->val); path.pop_back(); } };
方法二:
class Solution { vector<vector<int>> res; public: vector<vector<int>> pathSum(TreeNode* root, int sum) { if(!root) return res; vector<int> path; findpath(root, path, sum); return res; } void findpath(TreeNode *root, vector<int> path, int sum) { if(!root->left && !root->right && root->val == sum) { path.push_back(root->val); res.push_back(path); return; } if(!root->left && !root->right) return; //else { path.push_back(root->val); if(root->left) findpath(root->left, path, sum - root->val); if(root->right) findpath(root->right, path, sum - root->val); //} } };