【每日算法】LeetCode 113 —— 路径总和II(二百零五)

题目内容

给你二叉树的根节点 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
输出:[]

提示

1、树中节点总数在范围 [0, 5000] 内
2、-1000 <= Node.val <= 1000
3、-1000 <= targetSum <= 1000

题解

本题和上一题的原理是一样的,只不过本题需要把全部负责sum的路径记录下来。在做法上,依旧采用递归的思想进行,不过不同之处在于需要额外写一个递归函数,用于记录答案,这里采用DFS遍历的方式。具体就是:自顶向下从根开始,每次走过一个节点后sum更新,知道走到叶子节点,sum为0时,说明存在一条路径,此时记录一下路径答案。

具体请看代码。

代码

/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
vector<vector<int>> res;
vector<int> path;

vector<vector<int>> pathSum(TreeNode* root, int targetSum) {
if(root) dfs(root,targetSum);
return res;
}

void dfs(TreeNode* root,int sum){
//把当前点加入路径中
path.push_back(root->val);
sum -= root->val;
if(!root->left && !root->right){
if(!sum) res.push_back(path);
}else{
if(root->left) dfs(root->left,sum);
if(root->right) dfs(root->right,sum);
}
//恢复现场,回溯搜索的注意的地方
path.pop_back();
}
};
Author: Frederic Niu
Link: https://www.fredericniu.cn/2021/07/30/【每日算法】LeetCode-113-——-路径总和II(二百零五)/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
我的公众号