leetcode 107.二叉树的层次遍历-ii(binary tree level order traversal ii)C语言
1.description
https://leetcode-cn.com/problems/binary-tree-level-order-traversal-ii/description/
给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。
示例:
二叉树:[3,9,20,null,null,15,7],
返回其层次遍历结果:
[
[15,7],
[9,20],
[3]
]
2.solution
#define REALLOC_STEP 10
#define queue_is_empty(queue) (queue->head == NULL)
typedef struct list_node{
void *val;
struct list_node *next;
}Node;
typedef struct list_queue{
Node *head;
Node *tail;
int size;
}Queue;
// 创建初始队列
Queue *queue_create(){
Queue *queue = NULL;
queue = (Queue*)malloc(sizeof(Queue));
if(queue == NULL){
return NULL;
}
queue->head = NULL;
queue->tail = NULL;
queue->size = 0;
return queue;
}
// 入队
void enqueue(Queue *queue, void *val){
Node *node = NULL;
node = (Node*)malloc(sizeof(Node));
node->val = val;
node->next = NULL;
if(queue_is_empty(queue)){
queue->head = node;
}else{
queue->tail->next = node;
}
queue->tail = node;
(queue->size)++;
}
// 出队
int dequeue(Queue *queue, void **val){
if(queue_is_empty(queue)){
return -1;
}
*val = queue->head->val;
Node *p = queue->head;
queue->head = p->next;
// ***如果出队的是最后一个节点,记得把tail置为NULL
if(queue->head == NULL){
queue->tail = NULL;
}
(queue->size)--;
free(p);
return 0;
}
int getHeight(struct TreeNode* root){
int lhigh = 0;
int rhigh = 0;
if(root == NULL){
return 0;
}
lhigh = getHeight(root->left);
rhigh = getHeight(root->right);
return (lhigh > rhigh) ? (lhigh + 1) : (rhigh + 1);
}
int** levelOrderBottom(struct TreeNode* root, int* returnSize, int** returnColumnSizes){
if(root == NULL){
*returnSize = 0;
return NULL;
}
int height = getHeight(root);
*returnSize = height;
int **ans = (int**)malloc(sizeof(int*)*height);
*returnColumnSizes = (int*)malloc(sizeof(int)*height);
memset(*returnColumnSizes, 0, sizeof(int)*height);
Queue *queue = NULL;
struct TreeNode *node = NULL;
queue = queue_create();
// 根节点先入队
enqueue(queue, (void *)root);
// pop一个节点,输出其值,将左节点和右节点push,不断循环至队空
while(!queue_is_empty(queue)){
height--;
ans[height] = (int*)malloc(sizeof(int)*REALLOC_STEP);
int levelid = 0;
int size = queue->size;
(*returnColumnSizes)[height] = size;
while(size--){
dequeue(queue, (void *)&node);
if(levelid != 0 && levelid % REALLOC_STEP == 0){
ans[height] = (int*)realloc(ans[height], sizeof(int)*(levelid+REALLOC_STEP));
}
ans[height][levelid++] = node->val;
if(node->left){
enqueue(queue, (void *)node->left);
}
if(node->right){
enqueue(queue, (void *)node->right);
}
}
}
free(queue);
return ans;
}