112.路径总和
给你二叉树的根节点 root
和一个表示目标和的整数 targetSum
。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum
。如果存在,返回 true
;否则,返回 false
。
叶子节点 是指没有子节点的节点。
示例 1:
输入:root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22 输出:true 解释:等于目标和的根节点到叶节点路径如上图所示。
示例 2:
输入:root = [1,2,3], targetSum = 5 输出:false 解释:树中存在两条根节点到叶子节点的路径: (1 --> 2): 和为 3 (1 --> 3): 和为 4 不存在 sum = 5 的根节点到叶子节点的路径。
示例 3:
输入:root = [], targetSum = 0 输出:false 解释:由于树是空的,所以不存在根节点到叶子节点的路径。
这道题可以使用递归的方法做,因为当树为空,目标值为0时,会返回false,所以先判断树的根节点是否为空。然后访问节点的左右结点是否为空,若都为空,则判断目标值是否等于当前路径之和,然后递归继续访问下一个结点的左右结点,目标值变为targetSum-root->val,val为当前路径之和。其实是深度优先搜索的思想。
leetcode代码
/**
* 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:
bool hasPathSum(TreeNode* root, int targetSum) {
if(root==nullptr){
return false;
}
if(root->left==nullptr&&root->right==nullptr){
return targetSum==root->val;
}
return hasPathSum(root->left,targetSum-root->val)||hasPathSum(root->right,targetSum-root->val);
}
};
还可以使用广度优先搜索的方式,记录从根节点到当前节点的路径和,以防止重复计算。使用两个队列,分别存储将要遍历的节点,以及根节点到这些节点的路径和即可。
/**
* 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:
bool hasPathSum(TreeNode* root, int targetSum) {
if(root==nullptr){
return false;
}
//定义两个队列,分别存将要遍历的结点和根节点到这些结点的路径之和
queue<TreeNode *> que_node;
queue<int> val_node;
//分别将根节点和根节点到下一节点的路径入队
que_node.push(root);
val_node.push(root->val);
while(!que_node.empty()){
//定义节点队列中的当前节点
TreeNode *now=que_node.front();
//定义路径队列的中间变量
int temp=val_node.front();
//转换完成后各自出队
que_node.pop();
val_node.pop();
//判断当前节点的左右子节点是否为空,若为空,则返回当前路径总和是否等于目标值
if(now->left==nullptr&&now->right==nullptr){
if(targetSum==temp)
return true;
}
//判断左子节点是否为空,若为不为空,则入队,并将当前路径之和入队
if(now->left!=nullptr){
que_node.push(now->left);
val_node.push(temp+now->left->val);
}
//同样判断右子节点是否为空
if(now->right!=nullptr){
que_node.push(now->right);
val_node.push(temp+now->right->val);
}
}
return false;
}
};
有大佬能解释下为什么将if(targetSum==temp)return true;直接替换成return targetSum==temp会无法通过吗!!!!!!跪谢!!!!