题目:
给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。
示例 1:
输入:root = [3,9,20,null,null,15,7]
输出:[[3],[9,20],[15,7]]
示例 2:
输入:root = [1]
输出:[[1]]
示例 3:
输入:root = []
输出:[]
思路:(队列+迭代)
在学习二叉树的时候我们简要的学习了二叉树的三大遍历方式,先序遍历,中序遍历,后序遍历。这三种遍历方式均可以用递归的方法来实现,但今天的这个层序遍历有些不同。我们读懂题目后第一思路应该是设计一种算法来一层一层从左到右的放进队列然后利用队列先进先出的性质,再把队列的值转入到一个数组中去,最后返回这个数组即可。
代码实现:
/**
* 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().
*/
//这个题中的接口有三个,一个root,一个returnsize,一个returncolumnsize,这个题最开始
就是要先看懂这三个接口的意思,returnsize是要我们返回这个二叉树的层数,而returncolumnsize是
要我们返回每一层的节点个数
int** levelOrder(struct TreeNode* root, int* returnSize, int** returnColumnSizes){
//按照思路我们要返回一个数组,先动态创建一个二维数组,因为到时候,从队列弹出的每层的元素,都要
往这个数组里放,所以这个数组既要有层数,也要有列数。
int** ans=(int*)malloc(sizeof(int*)*2000);
//然后不要忘记给returnsize赋初始值,
*returnSize=0;
if(root==NULL){
return NULL;
}
int columnSizes[2000];
//模拟队列,队列里存储的是一个一个完整的二叉树的结点,所以类型为struct类型
struct TreeNode* queue[2000];
int rear=0, head=0;
queue[rear++]=root;
//一层一层遍历,把结点放到队列,再弹出到数组
while(rear!=head){
//因为每层的节点数不一样,所以每遍历到新的一层都要进行新的动态分配
ans[(*returnSize)]=(int*)malloc(sizeof(int*)*(rear-head));
columnSizes[(*returnSize)]=rear-head;
//因为在while循环中我们要对结点的左右子节点进行检查,以及检查后的压入队列,rear要++
所以我们要提前记录好head的位置,并且提前把head移动到rear的位置,为下一层的遍历做准备
int start=head;
head=rear;
for(int i=start;i<head;i++){
ans[(*returnSize)][i-start]=queue[i]->val;
if(queue[i]->left){
queue[rear++]=queue[i]->left;
}
if(queue[i]->right){
queue[rear++]=queue[i]->right;
}
}
//层数++
(*returnSize)++;
}
*returnColumnSizes=(int*)malloc(sizeof(int*)*(*returnSize));
for(int i=0;i<*returnSize;i++){
(*returnColumnSizes)[i]=columnSizes[i];
}
return ans;
}