题目
从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。
例如:
给定二叉树: [3,9,20,null,null,15,7]
,
3
/ \
9 20
/ \
15 7
返回:
[3,9,20,15,7]
提示:
节点总数 <= 1000
解题思路
1.题目要求我们从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。也就是按照二叉树的层序遍历打印二叉树。
2.我们只需要一个队列即可实现,首先我们判断树是否为空,若为空则返回一个没有元素的数组。然后我们建立一个队列来执行打印操作,再建立一个可变数组来存放遍历后的元素,因为我们不确定所给树的元素的个数,所以需要一个可变数组。
3.下面我们开始遍历,首先我们将根节点入队。然后进入一个while()循环,若队列不为空则将让队列进行出队操作,然后将刚出队的元素保存在可变数组中,再判断此元素是否有左右孩子,若存在左右孩子就将左右孩子入队。之后再次判断队列是否为空。循环往复,直到队列为空,就代表整棵树已经遍历完了。
4.最后我们需要将可变数组中的元素存入一个数组并且返回即可。
举个例子:
先让三入队
queue 不为空,让 3 出队,并且让 3 的左右孩子入队。
queue 不为空让 9 出队,因为 9 没有左右孩子,所以不进行入队操作
queue 不为空 让 20 出队,并且让 20 的左右孩子入队。
queue 不为空让 15 出栈,15 没有左右孩子 ,所以不进行入队操作
queue 不为空让 7 出栈,7 没有左右孩子 ,所以不进行入队操作
queue 为空,打印结束。
代码实现
class Solution {
public int[] levelOrder(TreeNode root) {
if(root == null){
return new int[0];
}
Queue<TreeNode> queue = new LinkedList<>();
List<Integer> res = new ArrayList<>();
queue.add(root);
while(!queue.isEmpty()){
TreeNode cur = queue.poll();
res.add(cur.val);
if(cur.left != null) queue.add(cur.left);
if(cur.right != null) queue.add(cur.right);
}
int[] num = new int[res.size()];
for(int i = 0; i < res.size(); i++){
num[i] = res.get(i);
}
return num;
}
}
测试结果