路径总和III---双dfs/哈希表记录二叉树前缀和
Posted C_YCBX Py_YYDS
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了路径总和III---双dfs/哈希表记录二叉树前缀和相关的知识,希望对你有一定的参考价值。
题目
题目解析
关于深搜方式:我们由于是要找路径,我们直接通过一个dfs用于求路径总和,而另一个递归用于枚举所有的起点(根节点)。
- 关于前缀和方式:
一般来说二叉树的前缀和用哈希表记录下来,为了确保记录的是同一条路径下的前缀和,所以需要对它进行回溯处理,也就是在求完这条路径后把它对应的哈希表的值进行 --
。
解题代码
双深搜
/**
* 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 pathSum(TreeNode* root, int targetSum) {
if(!root)
return 0;
int sum = 0;
sum += dfs(root,targetSum);
sum += pathSum(root->left,targetSum);//转换根节点
sum += pathSum(root->right,targetSum);
return sum;
}
int res = 0;
int tar;
int dfs(TreeNode* root,int targetSum){/*连续的取值处理*/
if(!root)
return 0;
int res = 0;
if(root->val==targetSum){
res++;
}
res+=dfs(root->left,targetSum-root->val);
res+=dfs(root->right,targetSum-root->val);
return res;
}
};
前缀和方式
class Solution {
public:
unordered_map<int, int> prefix;
int dfs(TreeNode *root, long long curr, int targetSum) {
if (!root) {
return 0;
}
int ret = 0;
curr += root->val;
if (prefix.count(curr - targetSum)) {
ret = prefix[curr - targetSum];
}
prefix[curr]++; //记录前缀和次数
ret += dfs(root->left, curr, targetSum);
ret += dfs(root->right, curr, targetSum);
prefix[curr]--; //防止不是同一条路径下的前缀和出现
return ret;
}
int pathSum(TreeNode* root, int targetSum) {
prefix[0] = 1;
return dfs(root, 0, targetSum);
}
};
以上是关于路径总和III---双dfs/哈希表记录二叉树前缀和的主要内容,如果未能解决你的问题,请参考以下文章
[LeetCode] 437. 路径总和 III (递归,二叉树)
[H二叉树] lc987. 二叉树的垂序遍历(dfs+哈希表)
2021-12-15: 路径总和 III。给定一个二叉树的根节点 root ,和一个整数 targetSum ,求该二叉树里节点值之和等于 targetSum 的 路径 的数目。路径 不需要从根节点开
LeetCode 113. 路径总和 II(dfs,回溯,列表,二叉树,Java)