/**
 * struct TreeNode {
 *  int val;
 *  struct TreeNode *left;
 *  struct TreeNode *right;
 * };
 */
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 *
 * @param root TreeNode类 the root of binary tree
 * @return int整型二维数组
 * @return int* returnSize 返回数组行数
 * @return int** returnColumnSizes 返回数组列数
 */
int count1[100];
int count2[100];
int count3[100];
static int i1=0;
static int i2=0;
static int i3=0;
int num[3];

int getSize(struct TreeNode*root)
{
    
    if(root==NULL)
    {
        return 0;
    }
    int m=0;
    int n=0;
    m=getSize(root->left);
    n=getSize(root->right);
    return m+n+1;
}

void preorder(struct TreeNode* root, int*count) {
    if (root) {
        count[i1] = root->val;
        printf("%d",i1);
        i1=i1+1;
        preorder(root->left, count);
        preorder(root->right, count);
    }
}
void inorder(struct TreeNode* root,int*count) {

    if (root != NULL) {
        inorder(root->left,count);
        count[i2] =root->val;
        printf("%d",i2);
        i2++;
        inorder(root->right,count);
    }
}
void posorder(struct TreeNode* root,int*count) {

    if (root != NULL) {
        outorder(root->left, count);
        outorder(root->right, count);
        count[i3++]= root->val;
        printf("%d",i3);

    }
}
int** threeOrders(struct TreeNode* root, int* returnSize,
                  int** returnColumnSizes ) {
    // write code here
    preorder(root, count1);
    inorder(root, count2);
    posorder(root, count3);
    *returnSize=3;
    int**ret=(int**)malloc(3*sizeof(int*));
    ret[0]=count1;
    ret[1]=count2;
    ret[2]=count3;
    num[0]=getSize(root);
    num[1]=getSize(root);
    num[2]=getSize(root);
    *returnColumnSizes=num;
    return ret;
}