题目
给定一个二叉树的根节点 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
解题
方法一:暴力回溯
遍历每个节点作为起始节点,都进行dfs回溯搜索
class Solution { public: int res=0; void dfs(TreeNode* cur,int64_t targetSum){ if(!cur) return; targetSum-=cur->val; if(targetSum==0) res++; dfs(cur->left,targetSum); dfs(cur->right,targetSum); } int pathSum(TreeNode* root, int targetSum) { if(!root) return 0; dfs(root,targetSum); pathSum(root->left,targetSum); pathSum(root->right,targetSum); return res; } };
方法二:前缀和
class Solution { public: int targetSum; int res=0; unordered_map<int64_t,int> mp; int pathSum(TreeNode* root, int targetSum) { if(!root) return 0; this->targetSum=targetSum; mp[0]=1; dfs(root,root->val); return res; } void dfs(TreeNode* root,int64_t val){ if(mp.count(val-targetSum)) res+=mp[val-targetSum]; mp[val]++; if(root->left) dfs(root->left,val+root->left->val); if(root->right) dfs(root->right,val+root->right->val); mp[val]--; } };