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); //} } };

 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号