美文网首页
103. Binary Tree Zigzag Level Or

103. Binary Tree Zigzag Level Or

作者: larrymusk | 来源:发表于2017-11-20 23:01 被阅读0次

同普通level order访问逻辑一样,只是在保存节点的时候,偶数层从左向右保存,奇数层从右向左保存:

            if(*returnSize%2 == 0)
                ret[*returnSize][i] = node->val;
            else 
                ret[*returnSize][size-i-1] = node->val;


/**
 * Return an array of arrays of size *returnSize.
 * The sizes of the arrays are returned as *columnSizes array.
 * Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
 */
struct queue{
    struct ListNode * dummy;
    struct ListNode * last;

};

struct queue * init_queue()
{
    struct queue * q = calloc(1, sizeof(struct queue));
    q->dummy = calloc(1, sizeof(struct ListNode));
    q->last = q->dummy;

    return q;

}

void enqueue(struct queue *q, void * val){
    struct ListNode * node = calloc(1, sizeof(struct ListNode));
    node->val = (int)val;
    node->next = NULL;
    q->last->next = node;
    q->last = node;
}

void * dequeue(struct queue * q)
{
    if(q->dummy->next){
        void * ret = (void *)q->dummy->next->val;
        if(q->last == q->dummy->next)
            q->last = q->dummy;
        q->dummy->next = q->dummy->next->next;


        return ret;
    }else
        return NULL;
}

int queue_size(struct queue *q)
{
    int i = 0;
    struct ListNode * p = q->dummy->next;
    while(p){
        p = p->next;
        i++;
    }
    return i;
}

int** zigzagLevelOrder(struct TreeNode* root, int** columnSizes, int* returnSize) {
    


    if(root == NULL)
        return NULL;
    struct queue * q = init_queue();
    enqueue(q, (void *)root);
    *columnSizes = calloc(10000, sizeof(int));
    int ** ret = calloc(10000, sizeof(int *));
    *returnSize = 0;

    while(q->dummy->next != NULL){
        
        //save node->val;
        
        int size = queue_size(q);
        printf("size = %d level = %d\n", *returnSize);
        ret[*returnSize] = calloc(size, sizeof(int));
        (*columnSizes)[*returnSize] = size;
        
        for(int i = 0; i < size; i++){
            struct TreeNode* node = (struct TreeNode *)dequeue(q);
            printf("%d  ", node->val);
            if(node->left)
                enqueue(q, (void *)node->left);
            if(node->right)
                enqueue(q, (void *)node->right);
            if(*returnSize%2 == 0)
                ret[*returnSize][i] = node->val;
            else 
                ret[*returnSize][size-i-1] = node->val;
        }
        *returnSize +=1;


    }

    return ret;
}

相关文章

网友评论

      本文标题:103. Binary Tree Zigzag Level Or

      本文链接:https://www.haomeiwen.com/subject/danbvxtx.html