目录
题目:
示例:
分析:
代码:
题目:
示例:
分析:
题目给我们一棵树,每个节点都有一个值,我们需要找出一条路径,这条路径上所有节点的值的和等于一个目标值,问我们能找出几条这样的路径。需要注意的是,路径的开头不必是根节点,路径的结尾不必的叶子节点。
那我们先降低要求,我们只找从根节点到叶子节点的路径中,有没有路径总和为目标值的路径,如果是这样,我们只需要在遍历二叉树的时候携带一个参数,这个参数是沿途节点的总和,然后我们遇到空指针(叶子结点的子树)的时候我们比较一下这个参数和目标值,如果一样的话是不是就有这样一条从根节点到叶子节点的路径总和为目标值。
我们再把要求升一点回来,我们找从根节点到任意节点的路径中,路径总和为目标值的路径。跟刚刚相比,不一样的是末尾节点从叶子节点变成了任意节点,那么我们只需要将刚刚比较参数和目标值的时机从遇到空指针变成了遍历到每个节点我们都要比较一下,这样就可以得到从根节点开始的路径路径总和为目标值的路径数了。
这时候我们再看题目的要求,是从任意节点开始到任意节点结束的路径总和等于目标值的路径数。
跟刚刚相比就是少了一个初始节点的条件限制,现在是初始节点不必是根节点,那么我们只需要在刚刚的遍历中我们再多套一层遍历,再每次遍历到一个新节点的时候,我们就当它是根节点,然后以这个“根节点”开始寻找到任意节点结束,然后路径总和等于目标值的路径数量了。
代码:
class Solution {
public:
int res=0;
void digui(TreeNode* root,int target,long temp){
if(root==nullptr) return;
temp+=root->val; //在临时变量中加上 当前节点的值
if(temp==target) res++; //做个判断,如果临时变量等于目标值了,那么答案加一
digui(root->left,target,temp); //接着遍历左子树
digui(root->right,target,temp); //接着遍历右子树
}
int pathSum(TreeNode* root, int targetSum) {
if(root==nullptr) return 0;
digui(root,targetSum,0); //以当前节点为起始节点,开始寻找满足条件的路径总和
pathSum(root->left,targetSum); //递归遍历左子树,在这次递归中,当前节点的左子树节点将会作为起始节点开始新的递归遍历
pathSum(root->right,targetSum); //递归遍历右子树
return res;
}
};