【每日leetcode】路径总和、路径总和II、路径总和III

这篇博客探讨了三个关于二叉树路径总和的问题:路径总和、路径总和II和路径总和III。在路径总和问题中,需要找到从根节点到叶子节点的路径,使得路径上的节点值之和等于给定的目标和。路径总和II要求找出所有这样的路径。路径总和III则是计算路径和等于给定数值的路径总数,路径方向必须向下。博客通过示例解释了如何解决这些问题。
摘要由CSDN通过智能技术生成

路径总和

给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。

说明: 叶子节点是指没有子节点的节点。

示例:
给定如下二叉树,以及目标和 sum = 22,

          5
         / \
        4   8
       /   / \
      11  13  4
     /  \      \
    7    2      1

返回 true, 因为存在目标和为 22 的根节点到叶子节点的路径 5->4->11->2。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    bool hasPathSum(TreeNode* root, int sum) {
        int cursum=0;
        bool flag=findsum(root,cursum,sum);
        return flag;
    }
    bool findsum(TreeNode* root,int cursum,int sum)
    {
        if(root==nullptr)
            return false;
        cursum+=root->val;
        if(root->left==nullptr&&root->right==nullptr&&cursum==sum)
            return true;
        return findsum(root->left,cursum,sum)||findsum(root->right,cursum,sum);
            
    }
};

路径总和II

给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。

说明: 叶子节点是指没有子节点的节点。

示例:
给定如下二叉树,以及目标和 sum = 22,

          5
         / \
        4   8
       /   / \
      11  13  4
     /  \    / \
    7    2  5   1

返回:

[
[5,4,11,2],
[5,8,4,5]
]

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    vector<vector<int>> pathSum(TreeNode* root, int sum) {
        vector<vector<int>> res;
        int cursum=0;
        vector<int> path;
        findpath(root,cursum,sum,path,res);
        return res;
    }
    void findpath(TreeNode* root,int cursum,int sum,vector<int>& path,vector<vector<int>> &res)
    {
        if(root==nullptr)
            return ;
        cursum=cursum+root->val;
        path.push_back(root->val);
        //叶节点且满足条件
        if(root->left==nullptr&&root->right==nullptr&&cursum==sum)
            res.push_back(path);
        if(root->left)
            findpath(root->left,cursum,sum,path,res);
        if(root->right)
            findpath(root->right,cursum,sum,path,res);
        path.pop_back();
    }
};

路径总和III

给定一个二叉树,它的每个结点都存放着一个整数值。

找出路径和等于给定数值的路径总数。

路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。

二叉树不超过1000个节点,且节点数值范围是 [-1000000,1000000] 的整数。

示例:

root = [10,5,-3,3,2,null,11,3,-2,null,1], sum = 8

      10
     /  \
    5   -3
   / \    \
  3   2   11
 / \   \
3  -2   1

返回 3。和等于 8 的路径有:

  1. 5 -> 3
  2. 5 -> 2 -> 1
  3. -3 -> 11
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    int pathSum(TreeNode* root, int sum) {
        if(root==nullptr)
            return 0;
        int res=0;
        int cursum=0;
        int count=0;
        findpath(root,sum,cursum,count);//以根节点为起点
        res=res+count;
        return res+pathSum(root->left,sum)+pathSum(root->right,sum);
        //以左子节点和右子节点为起点
    }
    void findpath(TreeNode* root,int sum,int cursum,int &count)
    {
        if(root==nullptr)
            return;
        cursum=cursum+root->val;
        if(cursum==sum)
            count++;
        findpath(root->left,sum,cursum,count);
        findpath(root->right,sum,cursum,count);
    }
};
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值