题目描述
从上往下打印出二叉树的每个节点,同层节点从左至右打印。
这道题目为遍历二叉树,但是与常见的前序、中序和后序遍历不同,为层次遍历。
![](https://img.haomeiwen.com/i14201322/2af7cebed00098f4.png)
理想的输出应为A、B、C、D、E、F、G
具体方法为:
首先打印A,然后将B、C存入容器,(容器中:B、C)
然后取B,将D、E存入容器,(容器中:C、D、E)
再取C,将F、G存入容器,(容器中:D、E、F、G)
再取D,因为D没有子节点,所以不存,(容器中:E、F、G)
再取E,因为E没有子节点,所以不存,(容器中:F、G)
再取F,因为F没有子节点,所以不存,(容器中:G)
再取G,因为G没有子节点,所以不存,(容器中:空)
由上述过程我们可以发现使用队列可以很好地完成。
附上代码
import java.util.Queue;
import java.util.ArrayList;
public class Solution {
public static ArrayList PrintFromTopToBottom(TreeNode root) {
ArrayList result = new ArrayList();
Queue queue = new LinkedList();
if(root == null) return result;
queue.offer(root);
while(!queue.isEmpty()) {
TreeNode now = queue.remove();
result.add(now.val);
if(now.left != null)
queue.offer(now.left);
if(now.right != null)
queue.offer(now.right);
}
return result;
}
}
针对Queue,额外补充一点知识。
offer()和add()的区别:
一些队列有大小限制,因此如果想在一个满的队列中加入一个新项,多出的项就会被拒绝。
这时新的offer()方法就可以起作用了。调用add()方法会抛出一个 unchecked 异常,而offer()方法只是返回 false。
poll()和remove()的区别:
remove() 和 poll() 方法都是从队列中删除第一个元素。remove() 的行为与 Collection 接口的版本相似,
但是新的 poll() 方法在用空集合调用时不是抛出异常,只是返回 null。因此新的方法更适合容易出现异常条件的情况。
peek()和element()的区别:
element() 和 peek() 用于在队列的头部查询元素。与 remove() 方法类似,在队列为空时, element() 抛出一个异常,而 peek() 返回 null。
网友评论