int** zigzagLevelOrder(struct TreeNode* root, int* returnSize, int** returnColumnSizes){
int** arr = (int**)calloc(100, sizeof(int*));
*returnSize = 0;
*returnColumnSizes = (int*)calloc(100, sizeof(int));
if (!root) return arr;
struct TreeNode* stArr[2000] = { 0 };
int i, j, left = 0, right = 0;
stArr[right++] = root;
while (left < right){
int len = right - left;
arr[(*returnSize)] = (int*)calloc(len, sizeof(int));
for (i = left + len - 1; i >= left; i--)
{
arr[(*returnSize)][(*returnColumnSizes)[*returnSize]++] = stArr[i]->val;
if ((*returnSize) % 2 == 0){
if (stArr[i]->left)
stArr[right++] = stArr[i]->left;
if (stArr[i]->right)
stArr[right++] = stArr[i]->right;
}
else{
if (stArr[i]->right)
stArr[right++] = stArr[i]->right;
if (stArr[i]->left)
stArr[right++] = stArr[i]->left;
}
}
(*returnSize)++;
left += len;
}
return arr;
}