这道题主要考察对二叉树指针的理解。
具体分析参考剑指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;
}