剑指 Offer 32 从上到下打印二叉树
从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。
例如:给定二叉树: [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回:
[3,9,20,15,7]
解题思路:
根据题意可以看出要求的是二叉树的 从上至下 打印(即按层打印),又称为二叉树的 广度优先搜索(BFS)。
BFS 通常借助 队列 的先入先出特性来实现。
算法流程:
特殊处理:当根节点为空时,由于题目给的返回值是int型数组,因此返回一个空数组
初始化:返回结果res[], 队列Deque,存放每个节点值的List集合。
实现逻辑:首先将头节点放入队列Deque中,进入循环中,循环结束条件是队列为空,代表二叉树已经遍历完了,首先将队列中的节点弹出,list存放弹出节点的值,再将每个节点的左右子节点放入到队列中,最终循环结束,所有节点都已经存放到list集合中,由于题目要求返回int集合,因为我们将list集合转为int数组即可。
实现逻辑图:(这图是我手画的,可能有些人容易理解,有些人有些看不懂,大家可以根据代码推导一下看一下到底是不是这个样子)
实现代码:
classSolution {
publicList<Integer>list;//存放每个节点值
publicint[] levelOrder(TreeNoderoot) {
if(root==null) returnnewint[0]; //针对头节点为空处理
list=newArrayList<>();
Deque<TreeNode>deque=newLinkedList<>();//队列用来存放每个节点
deque.add(root);
while(!deque.isEmpty()){
TreeNodenode=deque.poll(); //从队列弹出一个节点
list.add(node.val); // 将弹出节点的值放入到队列中
if(node.left!=null) deque.add(node.left);
if(node.right!=null) deque.add(node.right);
}
int[] arr=newint[list.size()];
for(inti=0; i<list.size(); i++){
arr[i] =list.get(i);
}
return arr;
}
}