113. 路径总和 II (C语言)

谁说胖子不能爱 提交于 2020-03-10 05:28:13

113. 路径总和 II (C语言)

用例1 :[1,0,1,1,2,0,-1,0,1,-1,0,-1,0,1,0]
2

用例2 :[-2,null,-3]
-5

temp[i++]=root->val;//开始用 path[*returnSize][i++]在用例1 中会出错,path[0][0]=1,path[0][1]=0。但是在回溯过程中,paht[1][0]没有被赋值。

// else if(n>sum){
//     printf("break,root->val=%d,i=%d\n",root->val,i);//希望可以剪枝,但是这会在第二个用例中出错,在数字为负数时,会出错的,n=-5, 数值-2 一进来就返回了
//     return false;
// }

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */


/**
 * 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().
 */

#define MAX_LEN 1000
bool dfs(struct TreeNode* root, int sum,int **path, int n,int i,int* returnSize, int** returnColumnSizes);
int** pathSum(struct TreeNode* root, int sum, int* returnSize, int** returnColumnSizes){
    int **path=malloc(sizeof(int*)*MAX_LEN);
    path[0]=malloc(sizeof(int)*MAX_LEN);
    *returnSize=0;
    *returnColumnSizes=malloc(sizeof(int)*MAX_LEN);
    if(dfs(root,sum,path,0,0,returnSize,returnColumnSizes)){
        return path;
    }
    else return NULL;
  
}
int temp[1000]={0};
bool dfs(struct TreeNode* root, int sum,int **path,int n,int i,int* returnSize, int** returnColumnSizes){
    if(root==NULL){
        path[(*returnSize)+1]=malloc(sizeof(int)*MAX_LEN);
        return false;
    }
    n=n+root->val;
    temp[i++]=root->val;//开始用 path[*returnSize][i++]在用例1 中会出错,path[0][0]=1,path[0][1]=0。但是在回溯过程中,paht[1][0]没有被赋值。
    //printf("val %d  i=%d,n=%d, path[%d][%d]=%d\n",root->val,i,n,*returnSize,i-1,temp[i-1]); 
    bool b=dfs(root->left,sum,path,n,i,returnSize,returnColumnSizes);
    bool a=dfs(root->right,sum,path,n,i,returnSize,returnColumnSizes);
    if(n==sum){
        if(root->right==NULL&&root->left==NULL){
        //printf("find it,root->val=%d,i=%d\n",root->val,i);
        memcpy(path[*returnSize],temp,i*sizeof(int));
        (*returnColumnSizes)[*returnSize]=i;
        (*returnSize)++;
        return true;
        }
    }
// else if(n>sum){
//     printf("break,root->val=%d,i=%d\n",root->val,i);//希望可以剪枝,但是这句会在第二个用例中出错,在数字为负数时,会出错的,n=-5, 数值-2 一进来就返回了
//     return false;
// }
    return a||b;
}

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!