给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。
叶子节点 是指没有子节点的节点。
示例 1:

输入:root = [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum = 22
输出:[[5,4,11,2],[5,8,4,5]]
示例 2:

输入:root = [1,2,3], targetSum = 5
输出:[]
示例 3:
输入:root = [1,2], targetSum = 0
输出:[]
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/path-sum-ii
基本的求解思路是采用深度优先遍历(递归)的方式,具体做法如下:
1)用深度优先遍历的方式找出从根节点到每个叶子节点的路径,并将这条路径中的每个节点值保存起来,计算从根节点到当前节点各个值的和
2)如果当前节点是根节点,并且当前路径的和与给定的目标和相等,就将当前路径加入到结果路径数组中;找出所有的路径为止。
- class Solution {
- public:
- vector
int>> pathSum(TreeNode* root, int targetSum) { - //采用深度优先搜索的方式
- vector
int>> ans; - if(root == nullptr)
- return ans;
- vector<int> path; //保存一条路径
-
- dfs(root, targetSum, path, ans, 0);
- return ans;
- }
-
- //深度优先搜索(path:一条路径, res:结果数组, curSum: path路径中各节点之和)
- void dfs(TreeNode* root, int targetSum, vector<int> path, vector
int >>& res, int curSum) - {
- if(root == nullptr)
- return;
- curSum += root->val;
- path.push_back(root->val);
- if(root->left == nullptr && root->right == nullptr && curSum == targetSum)
- {
- res.push_back(path); //当前路径满足要求
- return;
- }
- if(root->left) //左子节点存在
- dfs(root->left, targetSum, path, res, curSum);
- if(root->right) //右子节点存在
- dfs(root->right, targetSum, path, res, curSum);
- }
- };