该题的思路是使用深度递归,从每个根结点开始,向下遍历所有的子树,判断结果。
1.题目如下:
给定一个二叉树的根节点 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]
-109 <= Node.val <= 109
-1000 <= targetSum <= 1000
原题链接:https://leetcode.cn/problems/path-sum-iii/?favorite=2cktkvj
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) {}
* };
*/
class Solution {
public:
//方法一:深度遍历
/*
//该段 错误 的原因是,当往下遍历到targetSum==0的时候,再继续用getNum(root,targetNum)会把下面的分支计算为有效
//对于根节点的遍历,需要每个根节点都是崭新的targetNum
int pathSum(TreeNode* root, int targetSum) {
if(!root){
return 0;
}
int sum=0;
getNum(root,targetSum,sum);
return sum;
}
void getNum(TreeNode* root,long targetSum,int &sum){
if(!root){
return;
}
if(targetSum==root->val){
sum++;
return;
}
getNum(root->left,targetSum-root->val,sum);
getNum(root->right,targetSum-root->val,sum);
//当targetsum为0之后,这两个递归会不断的向下,使结果错误
getNum(root->left,targetSum,sum);
getNum(root->right,targetSum,sum);
}
*/
//深度优先遍历
//该函数反回的是算上了根节点的值的路径数
int rootSum(TreeNode* root, long targetSum) {
if (!root) {
return 0;
}
int ret = 0;
if(root->val==targetSum){
ret++;
}
ret+=rootSum(root->left,targetSum-root->val);
ret+=rootSum(root->right,targetSum-root->val);
return ret;
}
int pathSum(TreeNode* root,int targetSum) {
if (!root) {
return 0;
}
//向下遍历的同时每次调用rootSum都是未改变的targetSum
int res=rootSum(root, targetSum);
res+=pathSum(root->left, targetSum);
res+=pathSum(root->right, targetSum);
return res;
}
};