Major changes: //-------->
Minor changes: //
#include <stdio.h>
#include <stdlib.h>
struct TreeNode
{
int val;
struct TreeNode *left;
struct TreeNode *right;
};
void nodesVal(struct TreeNode *root, int *returnSize, int **returnArray)
{
if (root != NULL)
{
//-------> (*returnArray)[0] instead of *returnArray[0] ----> [] has higher priority than *
// I changed the order of those two lines so that I don't say size++ and then use size-1 (you can ignore this)
(*returnArray)[*(returnSize)] = root->val;
*(returnSize) = *(returnSize) + 1;
// when you enter this, you already check for NULL, so I removed (if) --- However, this can be ignored
nodesVal(root->left, returnSize, returnArray);
nodesVal(root->right, returnSize, returnArray);
}
}
int *preorderTraversal(struct TreeNode *root, int *returnSize)
{
int *returnArray = (int *)malloc(sizeof(int) * 100);
*returnSize = 0;
// ---------> you were passing &returnSize (int**). However, the function needs (int*). So, pass returnSize
nodesVal(root, returnSize, &returnArray);
return returnArray;
}
void constructNode(struct TreeNode**root,struct TreeNode*left,struct TreeNode* right,int val){
(*root)->left = left;
(*root)->right = right;
(*root)->val = val;
}
int main()
{
struct TreeNode*root = (struct TreeNode*)malloc(sizeof(struct TreeNode));
struct TreeNode*node1 = (struct TreeNode*)malloc(sizeof(struct TreeNode));
struct TreeNode*node2 = (struct TreeNode*)malloc(sizeof(struct TreeNode));
struct TreeNode*node3 = (struct TreeNode*)malloc(sizeof(struct TreeNode));
constructNode(&root,node1,node2,1);
constructNode(&node1,node3,NULL,2);
constructNode(&node2,NULL,NULL,3);
constructNode(&node3,NULL,NULL,4);
int* returnedSize = malloc(sizeof(int));
int* arr = preorderTraversal(root,returnedSize);
for (int i = 0; i < *returnedSize; i++)
{
printf("%d ",arr[i]);
}
printf("\n");
free(arr);
free(returnedSize);
free(root);
free(node1);
free(node2);
free(node3);
return 0;
}