题目:从上到下打印二叉树的每个节点,同一层的节点按照从左到右的顺序打印。例如下图中的二叉树,则依次打印出[8,6,10,5,7,9,11]。二叉树节点的定义如下:
public class BinaryTreeNode {
int value;
BinaryTreeNode leftNode;
BinaryTreeNode rightNode;
public BinaryTreeNode(int value) {
this.value = value;
this.leftNode = null;
this.rightNode = null;
}
}
本题的意思其实就是对一棵树进行广度优先遍历。要想一层一层往下遍历,那么应该在遍历到根节点打印的同时,记录好它的左右子节点;然后依次取出左右子节点打印的同时,记录它们各自的左右子节点...如果要实现这样的效果,我们可以使用一个队列来记录和打印这些节点。结合本题例子,大致操作过程如下图:
每次打印一个节点的时候,如果该节点有子节点,则把该节点的子节点放到一个队列的末尾。接下来到队列的头部取出最早进入队列的节点,重复前面的打印操作,直至队列中所有的节点都被打印出来。
下面代码我们使用的是LinkedList当作队列(offer()和remove()方法分别做队列元素的放入和取出操作),使用ArrayList作为打印输出的集合。
class Solution32 {
public void printFromTopToBottom(BinaryTreeNode root) {
if (root == null) return;
Queue<BinaryTreeNode> queue = new LinkedList<>();
List<Integer> list = new ArrayList<>();
queue.offer(root);
while (!queue.isEmpty()) {
BinaryTreeNode node = queue.remove();
list.add(node.value);
if (node.leftNode != null) {
queue.offer(node.leftNode);
}
if (node.rightNode != null) {
queue.offer(node.rightNode);
}
}
System.out.println(list);
}
}