LC437 路径总和Ⅲ
解法一 两次递归
思路:先序递归遍历每个节点 + dfs确定路径和为targetSum的路径数目
int res = 0;
int pathSum(TreeNode* root, int targetSum) {
if(root == nullptr) return 0;
dfs(root, targetSum);
pathSum(root->left, targetSum);
pathSum(root->right, targetSum);
return res;
}
void dfs(TreeNode* root, int targetSum) {
if(root == nullptr) return;
if(targetSum == root->val) res++;
dfs(root->left, targetSum - root->val);
dfs(root->right, targetSum - root->val);
}
解法二 前缀和
参考链接
前缀和:当前节点到根节点的路径和
思路:抵达当前节点B后,将前缀和累加,然后查找在前缀和上,有没有前缀和curSum - targetSum 的节点A,存在即表示从A到B有一条路径之和满足条件。
两节点间的路径和 = 两节点的前缀和之差
结果加上满足前缀和curSum - targetSum 的节点的数量,然后递归进入左右子树。
int pathSum(TreeNode* root, int targetSum) {
this->targetSum = targetSum;
hashMap[0] = 1;
return dfs(root, 0);
}
unordered_map<int, int> hashMap;
int targetSum;
int dfs(TreeNode* root, int curSum) {
if(root == nullptr) return 0;
int res = 0;
curSum += root->val;
res += hashMap[curSum - targetSum];
hashMap[curSum]++;
res += dfs(root->left, curSum);
res += dfs(root->right, curSum);
hashMap[curSum]--;
return res;
}
剑指34 二叉树中和为某一值的路径
输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。
vector<vector<int>> pathSum(TreeNode* root, int target) {
if(root == nullptr) return res;
dfs(root, target);
return res;
}
vector<vector<int>> res;
vector<int> path;
void dfs(TreeNode* root, int target) {
path.push_back(root->val);
if(root->val == target && root->left == nullptr && root->right == nullptr) res.push_back(path);
if(root->left) dfs(root->left, target - root->val);
if(root->right) dfs(root->right, target - root->val);
path.pop_back();
}
|