题目描述
题目分析
模式识别:涉及到路径遍历的问题。
方法:本文使用两种方法来解析该题,分别是纯粹的DFS,以及借助前缀和技巧的DFS
方法一:纯DFS
每一次都从一个结点开始,一路走到底,即碰到叶子结点就结束搜索(程序的出口),这样的话的使用两重递归。
第一重递归:除了根节点外,还需要遍历根结点的左右子树,原因:因为题目不要求路径的起点一定要从根结点开始。
第二重递归:原本DFS中就有的递归。
编程(CPP)—方法一
/**
* 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:
int count = 0;
int pathSum(TreeNode* root, int targetSum) {
if (!root) {
return 0;
}
// 从根结点开始搜索路径
dfs(root, targetSum);
// 因为路径的起点不限制在根结点,因此需要使用递归
pathSum(root->left, targetSum);
pathSum(root->right, targetSum);
return count;
}
void dfs(TreeNode* root, int sum) {
if (!root) {
return;
}
sum -= root->val;
if (sum == 0) {
count++;
}
// 因为终点不要求是叶子,所以一条路径下面可能还有另一条
dfs(root->left, sum);
dfs(root->right, sum);
}
};
运行效果
方法二
使用前缀和的技巧。