0
点赞
收藏
分享

微信扫一扫

LeetCode 路径总和


给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。

叶子节点 是指没有子节点的节点。

示例 1:

输入:root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22
输出:true
解释:等于目标和的根节点到叶节点路径如上图所示。

 

这两个题目类似,都是求从根节点到叶结点的“路径和”。只不过一个是判断是否存在路径和等于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 ;
}


};

 

举报

相关推荐

0 条评论