一、题目描述
给你二叉树的根节点 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<vector<int>> pathSum(TreeNode* root, int targetSum) {
//采用深度优先搜索的方式
vector<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<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);
}
};