力扣Hot100-路径总和iii

给定一个二叉树的根节点 root ,和一个整数 targetSum ,求该二叉树里节点值之和等于 targetSum 的 路径 的数目。

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

示例 1:

输入:root = [10,5,-3,3,2,null,11,3,-2,null,1], targetSum = 8
输出:3
解释:和等于 8 的路径有 3 条,如图所示。

示例 2:

输入:root = [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum = 22
输出:3

提示:

  • 二叉树的节点个数的范围是 [0,1000]
  • -10^9 <= Node.val <= 10^9 
  • -1000 <= targetSum <= 1000 

易忽略问题:

//注意节点值可能为负数

 //2:路径往下值得是各个节点不在同一层,但可以是根,左,右,不一定全是在左边

 //3:注意使用的类型,int Long long int

解题思路:

将树中的节点分别视为根节点,从根节点开始使用前序遍历求和,当左子树节点遍历完后开始回溯,回溯时将加入计算的左子树值剪掉,继续计算右子树值

例如:在下面图中,遍历左子树:10->5->3(1)->3(2)之后开始从3(2)回溯到节点3(1),此时需要减掉3(2),再开始遍历右子树,将3(1)的右孩子-2的值加入求和。

代码:

/**
 * 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) {}
 * };
 */
 //注意节点值可能为负数
 //2:路径往下值得是各个节点不在同一层,但可以是根,左,右,不一定全是在左边
 //3:注意使用的类型,int Long long int
class Solution {
    //将每一个节点视为根开始查找
public:
void getsum(TreeNode* root,int targetSum,int &n, long long int& sum){
    if(root==NULL) return;
    sum+=root->val;
    if(sum==targetSum)n++;
    getsum(root->left,targetSum,n,sum);
    if(root->left!=NULL){
         sum-=root->left->val;
    }
   
    getsum(root->right,targetSum,n,sum);
     if(root->right!=NULL){
         sum-=root->right->val;
    }

}
void find(TreeNode* root,int targetSum,int& n){
    if(root==NULL) return ;
    long long int sum=0;//当前节点
    //往左遍历查找
    TreeNode* l=root;
    getsum(l,targetSum,n,sum);
    //往右遍历查找
  
    TreeNode* r=root;
 

    //递归遍历左子树
    find(root->left,targetSum,n);
    //递归遍历右子树
    find(root->right,targetSum,n);

}
    int pathSum(TreeNode* root, int targetSum) {
        int n=0;
        find(root,targetSum,n);
        return n;

    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

半截詩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值