题干:
从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。
例如:
给定二叉树: [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回其层次遍历结果:
[
[3],
[9,20],
[15,7]
]
提示:
节点总数 <= 1000
解题思路:
核心步骤和之前的面试题31差不多,不同的地方在于,打印方式是一个二维数组,且每行的长度不同,用c语言比较难以处理,要不断的赋值和更新行长度。
代码实现:
#define INT_MAX 1010
int** levelOrder(struct TreeNode* root, int* returnSize, int** returnColumnSizes){
if (root == NULL){ //判断树是否存在
* returnSize = 0;
return NULL;
}
//定义一个指针队列存储所有节点的地址,并分配每一列的内存,定义一个二维数组做输出
struct TreeNode** Queue = (struct TreeNode**)calloc(INT_MAX, sizeof(struct TreeNode*));
* returnColumnSizes = (int*)calloc(INT_MAX, sizeof(int));
int** nums = (int**)calloc(INT_MAX, sizeof(int*));
//初始化各项参数,包括首尾指针,行数
int head = 0;
int tail = 0;
* returnSize = 0;
Queue[tail++] = root; //根节点入队
int rowSize = tail - head;
while (rowSize){
nums[* returnSize] = (int*)calloc(rowSize, sizeof(int)); //分配每一行的存储空间
(* returnColumnSizes)[* returnSize] = rowSize;
for (int i = 0; i < rowSize; i++){
if (Queue[head] -> left != NULL){
Queue[tail++] = Queue[head] -> left;
}
if (Queue[head] -> right != NULL){
Queue[tail++] = Queue[head] -> right;
}
nums[* returnSize][i] = Queue[head] -> val;
head++;
}
(* returnSize)++; //行数加一
rowSize = tail - head; //计算每一层的节点数
}
return nums;
}