102. Binary Tree Level Order Traversal
1. 题目
Given a binary tree, return the level order traversal of its nodes’ values. (ie, from left to right, level by level).
For example:
Given binary tree [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
return its level order traversal as:
[
[3],
[9,20],
[15,7]
]
2. 解法
二叉树层次遍历最通用的方法是借助队列。C语言没有提供队列接口,因此我们自己实现一个吧。
- 思路
使用队列实现层次遍历,同时在入队之前统计当前层次节点的个数,在出队时通过出队节点个数来判断是否到下一层。
- 代码实现:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
/*
* returnSize: 无需分配,用来存放二维数组的行数
* returnColumnSizes:需要分配空间,用来存放二维数组每一行元素的个数
* return xxx: 返回的二维数组
*/
# define NodeNum 1024
/**
* 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;
if(NULL == root){
return NULL;
}
int *result = (int *)malloc(sizeof(int) * NodeNum);/*用来存放结果信息*/
int **resultArray = (int **)malloc(sizeof(int *) * NodeNum);/*用来存放结果信息*/
*returnColumnSizes = (int *)malloc(sizeof(int) * NodeNum);
memset(*returnColumnSizes, 0 , sizeof(int) * NodeNum);
struct TreeNode **queue = (struct TreeNode **)malloc(sizeof(struct TreeNode *) * NodeNum);
int head=0, rear=0;
int cnt=0, totalNum=0;
int layer = 0;
queue[rear++] = root;
(*returnColumnSizes)[layer] = 1;
resultArray[layer] = result + totalNum;
while(head != rear){/*非空*/
root = queue[head%NodeNum];
head++;
int val = root->val;
result[totalNum++] = val;
cnt++;
if(root->left){
queue[rear%NodeNum] = root->left;
rear++;
(*returnColumnSizes)[layer+1]++;
}
if(root->right){
queue[rear%NodeNum] = root->right;
rear++;
(*returnColumnSizes)[layer+1]++;
}
if(cnt == (*returnColumnSizes)[layer]){
cnt=0;
resultArray[++layer] = result + totalNum;
}
}
*returnSize = layer;
return resultArray;
}