题目
从上往下打印出二叉树的每个节点,同层节点从左至右打印。
程序核心思想
原来想用递归做,但是发现递归一下就到最底层了,不能实现层级遍历。所以想到用队列,队列里面存放的是树的节点,出一个结点就添加进去它的左孩子和右孩子,这样就能实现层级遍历了。
Tips
- 队列的一些使用方法:
Java 集合中的 Queue 继承自Collection 接口,Deque, LinkedList, PriorityQueue, BlockingQueue 等类都实现了它。
Queue使用时要尽量避免Collection的add()和remove()方法,而是要使用offer()来加入元素,使用poll()来获取并移出元素。它们的优点是通过返回值可以判断成功与否,add()和remove()方法在失败的时候会抛出异常。 如果要使用前端而不移出该元素,使用element()或者peek()方法。 - 创建队列:
Queue<TreeNode> queue = new LinkedList<TreeNode>();
添加元素:offer()
出队:poll()
是否为空:isEmpty()
查看队头元素(不出队):peek()或element()
代码
import java.util.ArrayList;
import java.util.Queue;
import java.util.LinkedList;
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public ArrayList<Integer> PrintFromTopToBottom(TreeNode root) {
Queue<TreeNode> queue = new LinkedList<TreeNode>();
ArrayList<Integer> array = new ArrayList<Integer>();
if(root == null) return array;
queue.offer(root);
while(queue.isEmpty() == false){
TreeNode node = (TreeNode)queue.poll();
if(node.left != null) queue.offer(node.left);
if(node.right != null) queue.offer(node.right);
array.add(node.val);
}
return array;
}
}