112. 路径总和 - 力扣(LeetCode)
1、用队列
两个队列,先进先出
node队列存节点;
sum队列存每条路径走到这个节点的val的总和;
节点和总和对应着同时存入队列,同时出队列;
class Solution {
public:
bool hasPathSum(TreeNode* root, int targetSum) {
if(root == nullptr)
return false;
queue<TreeNode*> node;
queue<int> sum;
node.push(root);
sum.push(root->val);
while(!node.empty())
{
TreeNode* now = node.front();
int tmp = sum.front();
node.pop();
sum.pop();
if(now->left == nullptr && now->right == nullptr)
{
if(tmp == targetSum)
{
return true;
}
continue;
}
if(now->left !=nullptr)
{
node.push(now->left);
sum.push(now->left->val + tmp);
}
if(now->right !=nullptr)
{
node.push(now->right);
sum.push(now->right->val + tmp);
}
}
return false;
}
};
2、递归
targetsum每层-root->val直到和最后一个不为空的root->val相等;
每次递归传当前节点的左右子树以及当前节点的val直到root为空结束
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);
}
};