链接:https://leetcode.cn/problems/path-sum-ii/solution/-by-xun-ge-v-i8gb/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
题目![](https://img-blog.csdnimg.cn/449a6962862640168e7d0d30ad14baa1.png)
示例![](https://img-blog.csdnimg.cn/dd5f1fe9c4db443f8a93901f8e5c4783.png)
思路
解题思路
题目需要找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。
那么递归三部曲
- 确定传入层数和返回值
因为我们需要寻找从根节点到叶子节点 路径总和等于给定目标和的路径。所以肯定需要根节点和目标和。如果使用全局变量其他参数就不需要了,但是我用的指针,还需要一个参数记录当前走过的路径和一个保存有效返回值数组
void dfs(struct TreeNode * root, int targetSum, int ** res, int * resSize, int * path, int pathSize, int ** returnColumnSizes)
- 判断结束条件
当然是遍历到空节点返回
if(root == NULL)
return ;
- 单层逻辑
我们只需要比较一下当前元素加上之前路径上的元素之和等不等于目标和即可
**小细节:**我们可以直接利用目标和,每次经过一个节点就把目标和-当前元素值,这样就即记录了遍历的节点元素,也方便后面比较,只需要判断目标和等不等于0即可
targetSum -= root->val;
path[pathSize++] = root->val;
//因为树元素存在 <0 的情况,所以不能剪枝
if(root->left == NULL && root->right == NULL && targetSum == 0)
{
res[(*resSize)] = (int *)malloc(sizeof(int) * (pathSize ));
memcpy(res[(*resSize)], path, sizeof(int) * (pathSize ));
(*returnColumnSizes)[(*resSize)++] = pathSize ;
}
- 回溯
dfs(root->left, targetSum, res, resSize, path, pathSize, returnColumnSizes);
dfs(root->right, targetSum, res, resSize, path, pathSize, returnColumnSizes);
回溯全部隐藏在函数递归调用上了,回溯全部隐藏在函数递归调用上了,因为我们将pathSize作为dfs的形参传入的,并没有改变pathSize实参的值,因为C语言中形参不能改变实参的实际值,相当于是回溯处理
代码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
void dfs(struct TreeNode * root, int targetSum, int ** res, int * resSize, int * path, int pathSize, int ** returnColumnSizes)
{
if(root == NULL)
return ;
targetSum -= root->val;
path[pathSize++] = root->val;
//因为树元素存在 <0 的情况,所以不能剪枝
if(root->left == NULL && root->right == NULL && targetSum == 0)
{
res[(*resSize)] = (int *)malloc(sizeof(int) * (pathSize));
memcpy(res[(*resSize)], path, sizeof(int) * (pathSize ));
(*returnColumnSizes)[(*resSize)++] = pathSize ;
}
dfs(root->left, targetSum, res, resSize, path, pathSize, returnColumnSizes);
dfs(root->right, targetSum, res, resSize, path, pathSize, returnColumnSizes);
return;
}
/**
* Return an array of arrays of size *returnSize.
* The sizes of the arrays are returned as *returnColumnSizes array.
* Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
*/
int** pathSum(struct TreeNode* root, int targetSum, int* returnSize, int** returnColumnSizes){
int ** res = (int **)malloc(sizeof(int *) * 2001);
*returnColumnSizes = (int *)malloc(sizeof(int) * 2001);
int * path = (int *)malloc(sizeof(int) * 2001);
*returnSize = 0;
dfs(root, targetSum, res, returnSize, path, 0, returnColumnSizes);
return res;
}
作者:xun-ge-v
链接:https://leetcode.cn/problems/path-sum-ii/solution/-by-xun-ge-v-i8gb/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。