一、题目描述
从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。
例如:
给定二叉树[3,9,20,null,null,15,7]
3
/ \
9 20
/ \
15 7
返回:
[3,9,20,15,7]
提示:
节点总数<=1000
二、思路分析
注:思路分析中的一些内容和图片参考自力扣各位前辈的题解,感谢他们的无私奉献
思路
二叉树的层序遍历又称为二叉树的广度优先搜索(BFS),BFS通常借助队列的先入先出特性来实现。从根结点开始 ,首先根结点进入这个队列。进入队列之后,接下来做一个循环,每次循环就是基本的过程就这样的:从队列里面拎出一个元素访问该结点,然后把这个结点的左右儿子放到队列里面去,再进入下一个循环。再从队列里面拎出一个元素出来,访问这个结点,再把它的左右儿子放到队列里去…
复杂度分析:
时间复杂度 O ( N ) \rm{O(N)} O(N):N
为二叉树的节点数量,即BFS需循环N
次。
空间复杂度 O ( N ) \rm{O(N)} O(N): 最差情况下,即当树为平衡二叉树时,最多有N/2
个树节点同时在queue中,使用O(N)
大小的额外空间。
三、整体代码
整体代码如下
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
#define MAX_SIZE 1001
int* levelOrder(struct TreeNode* root, int* returnSize){
*returnSize = 0; //二叉树结点数,初始化为0
if (!root) { //如果根结点为空,返回NULL
return NULL;
}
int *ans = (int*)malloc(sizeof(int)*MAX_SIZE); //ans为返回的数组,为其分配内存空间
struct TreeNode *queue[MAX_SIZE]; //创建一个队列,用于树的各个结点后序的入队出队操作
int head = -1; //队首元素的下标
int tail = 0; //队尾元素后面的位置,下次入队的元素就插在这里
queue[++head] = root; //先将根结点入队
tail++;
while (head < tail) {
struct TreeNode *tmp = queue[head++]; //出队一个结点
ans[(*returnSize)++] = tmp->val; //将结点的值保存进ans
//如果左孩子存在,则左孩子入队。如果右孩子存在,则右孩子入队。
if (tmp->left != NULL) {
queue[tail++] = tmp->left;
}
if (tmp->right != NULL) {
queue[tail++] = tmp->right;
}
}
return ans;
}
运行,测试通过