Leetcode 剑指 Offer 34 二叉树中和为某一值的路径

39 篇文章 0 订阅
34 篇文章 0 订阅

这道题主要考察对二叉树指针的理解。
具体分析参考剑指offer34.

时间和内存消耗以及源代码如下:
时间和内存消耗

/**
 * 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 Maxsize 10000

void pathDetail(struct TreeNode* root, int** pathTemp, int* sizetemp, int sum, int* returnSize, int** path, int** returnColumnSizes, int* sumtemp)
{
    if (root == NULL)
    {
        return;
    }

    (*pathTemp)[*sizetemp] = root->val;
    (*sumtemp) += (root->val);
    (*sizetemp)++;

    if (root->left == NULL && root->right == NULL)
    {
        if (sum == (*sumtemp))
        {
            path[*returnSize] = (int*) malloc ((*sizetemp) * sizeof(int));
            for (int i=0; i<(*sizetemp); i++)
            {
                path[*returnSize][i] = (*pathTemp)[i];
            }
            (*returnColumnSizes)[*returnSize] = *sizetemp;
            (*returnSize)++;        
        }

        (*sumtemp) -= (root->val);
        memcpy((*pathTemp), (*pathTemp), ((*sizetemp)--) * sizeof(int));
        return;
    }

    if (root->left == NULL && root->right == NULL)
    {
        (*sumtemp) -= (root->val);
        memcpy((*pathTemp), (*pathTemp), ((*sizetemp)--) * sizeof(int));
        return;
    }

    pathDetail(root->left, pathTemp, sizetemp, sum, returnSize, path, returnColumnSizes, sumtemp);
    pathDetail(root->right, pathTemp, sizetemp, sum, returnSize, path, returnColumnSizes, sumtemp);
    (*sumtemp) -= (root->val);
    memcpy((*pathTemp), (*pathTemp), ((*sizetemp)--) * sizeof(int));

    return;
}

int** pathSum(struct TreeNode* root, int sum, int* returnSize, int** returnColumnSizes){

    if (root == NULL)
    {
        *returnSize = 0;
        **returnColumnSizes = 0;
        return  NULL;
    }
    
    int** path = (int**) malloc (2 * Maxsize * sizeof(int*));

    int** pathTemp = (int**) malloc (sizeof(int*)); 
    (*pathTemp) =   (int*) malloc (Maxsize * sizeof(int));

    int* sizetemp = (int*) malloc (sizeof(int));
    *sizetemp = 0;

    int* sumtemp = (int*) malloc (sizeof(int));
    *sumtemp = 0;

    (*returnColumnSizes) = (int*) malloc (2 * Maxsize * sizeof(int));
    *returnSize = 0;
    
    pathDetail(root, pathTemp, sizetemp, sum, returnSize, path,
             returnColumnSizes, sumtemp);

    return  path;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值