来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/6eUYwP
题目描述:
给定一个二叉树的根节点 root ,和一个整数 targetSum ,求该二叉树里节点值之和等于 targetSum 的 路径 的数目。
路径 不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。
示例 1:
输入:root = [10,5,-3,3,2,null,11,3,-2,null,1], targetSum = 8
输出:3
解释:和等于 8 的路径有 3 条,如图所示。
我的代码:
递归,时间复杂度:n^2;空间复杂度:n
/**
* 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 rootSum(TreeNode* r, int targetSum){
if(!r)
return 0;
int res=0;
if(targetSum == r->val){
res++;
}
res+=rootSum(r->left, targetSum-r->val);
res+=rootSum(r->right, targetSum-r->val);
return res;
}
int pathSum(TreeNode* root, int targetSum) {
if(root==nullptr) return 0;
int res = rootSum(root,targetSum);
//将后面的节点作为根节点
res+=pathSum(root->left, targetSum);
res+=pathSum(root->right, targetSum);
return res;
}
};
提升算法:
递归,时间复杂度:n;空间复杂度:n
把从根到每个节点的和保存到哈希表中,作为一个前缀和。
/**
* 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 {
private:
unordered_map<long long, int> pre;
public:
int dfs(TreeNode* r, int curr, int targetSum){
if(!r) return 0;
int res=0;
curr+=r->val;
if(pre.count(curr-targetSum))//在已经保存的前缀中,找到一个前缀刚好等于当前节点到根节点curr减去targetSum
res=pre[curr-targetSum];
pre[curr]++;
res+=dfs(r->left,curr,targetSum);//左节点中符合条件的个数
res+=dfs(r->right,curr,targetSum);//右节点中符合条件的个数
pre[curr]--;
return res;
}
int pathSum(TreeNode* root, int targetSum) {
pre[0]=1;//如果从根路径到目前节点的值为targetSum
return dfs(root,0,targetSum);
}
};