LeetCode·113.路径总和||·递归回溯

链接:https://leetcode.cn/problems/path-sum-ii/solution/-by-xun-ge-v-i8gb/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 

题目

示例

思路

解题思路
题目需要找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。
那么递归三部曲

  • 确定传入层数和返回值

因为我们需要寻找从根节点到叶子节点 路径总和等于给定目标和的路径。所以肯定需要根节点和目标和。如果使用全局变量其他参数就不需要了,但是我用的指针,还需要一个参数记录当前走过的路径和一个保存有效返回值数组

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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值