给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。
叶子节点 是指没有子节点的节点。
示例 1:
输入:root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22
输出:true
解释:等于目标和的根节点到叶节点路径如上图所示。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/path-sum
112. 路径总和 - 力扣(LeetCode)https://leetcode.cn/problems/path-sum/113. 路径总和 II - 力扣(LeetCode)https://leetcode.cn/problems/path-sum-ii/思路:
这两个题目类似,都是求从根节点到叶结点的“路径和”。只不过一个是判断是否存在路径和等于TargetSum的路径,另一个还有打印出这些路径。
考察的就是二叉树的遍历,
void dfs(节点 , 节点值1 ,节点值2 ){
判断条件
在遍历左子树前完成的操作;
遍历左子树 ;
遍历右子树 ;
}
112 的代码
class Solution {
public:
// 寻找是否有一条 路径和的targetSum
// 一个巧妙的思路是
// 遍历树 , 每次减去该节点的 val , 如果到叶子节点了, sum 正好等于了叶结点的vl
// 说明存在
bool hasPathSum(TreeNode* root, int targetSum) {
if(root == nullptr) return false ; // 特判
if(root->left == nullptr && root->right == nullptr) {
return targetSum == root->val ;
}
if(root->left) {
hasPathSum(root->left,targetSum-=root->val) ;
}
if(root->right) {
hasPathSum(root->right,targetSum-=root->val) ;
}
return false ;
}
};
113的代码
class Solution {
public:
// 定义答案路径
vector<vector<int>> res ;
vector<vector<int>> pathSum(TreeNode* root, int targetSum) {
vector<int> path ;
dfs(root,0, targetSum,path) ;
return res ;
}
void dfs(TreeNode* root ,int sum, int targetSum , vector<int>& path ) {
// 终止条件
if(root == nullptr )return ;
if( (root->left == nullptr) && (root->right== nullptr)) {
path.push_back(root->val) ;
sum+=root->val ;
if(sum == targetSum) {
res.push_back(path) ;
}
return ;
}
path.push_back(root->val) ;
sum+=root->val ;
if(root->left){
dfs(root->left,sum,targetSum,path) ;
path.pop_back() ;
}
if(root->right) {
dfs(root->right,sum , targetSum,path) ;
path.pop_back() ;
}
return ;
}
};