NO.102 binary tree hierarchy traversal

Given a binary tree, the node returns its value hierarchical traversal. (Ie, layer by layer, from left to right to access all nodes).

For example:
Given a binary tree: [3,9,20, null, null, 15,7],

    3
   / \
  9  20
    /  \
   15   7

Return to its level through the results:

[
  [3],
  [9,20],
  [15,7]
]

/**
 * 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().
 */
int** levelOrder(struct TreeNode* root, int* returnSize, int** returnColumnSizes){
    *returnSize=0;
    struct TreeNode** save=NULL;
    int ** ret=NULL;
    *returnColumnSizes=NULL;
    if(root)
    {
        *returnSize=1;
        *returnColumnSizes=(int *)malloc(sizeof(int));
        (*returnColumnSizes)[0]=1;
        ret=(int**)realloc(ret,sizeof(int *));
        ret[0]=(int *)malloc(sizeof(int));
        ret[0][0]=root->val;
        save=(struct TreeNode**)realloc(save,sizeof(struct TreeNode*));
        save[0]=root;
        while(1)
        {
            struct TreeNode** tmp=NULL;
            int size=0;
            int *num=NULL;
            for(int i=0;i<(*returnColumnSizes)[(*returnSize)-1];i++)
            {
                if(save[i]->left)
                {
                    size++;
                    tmp=(struct TreeNode**)realloc(tmp,sizeof(struct TreeNode*)*size);
                    num=(int*)realloc(num,sizeof(int)*size);
                    tmp[size-1]=save[i]->left;
                    num[size-1]=save[i]->left->val;
                }
                if(save[i]->right)
                {
                    size++;
                    tmp=(struct TreeNode**)realloc(tmp,sizeof(struct TreeNode*)*size);
                    num=(int*)realloc(num,sizeof(int)*size);
                    tmp[size-1]=save[i]->right;
                    num[size-1]=save[i]->right->val;
                }
            }
            if(size==0)break;
            else
            {
                (* returnSize)++;
                *returnColumnSizes=(int *)realloc(*returnColumnSizes,sizeof(int)*(* returnSize));
                (*returnColumnSizes)[(* returnSize)-1]=size;
                ret=(int**)realloc(ret,sizeof(int *)*(* returnSize));
                ret[(* returnSize)-1]=num;
                free(save);
                save=tmp;
            }
        }
    }
    free(save);
    return ret;
}

When execution: 4 ms, beat the 97.00% of users in the Binary Tree Level Order Traversal of C submission

Memory consumption: 13.8 MB, defeated 47.62% of users in the Binary Tree Level Order Traversal of C submission

Guess you like

Origin blog.csdn.net/xuyuanwang19931014/article/details/91399023