题目描述
给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。
题目链接102.二叉树层序遍历
乍一看这个遍历顺序是和bfs(前几天讲的前序,中序,后序叫bfs)是一样的,我们可以直接得出层序遍历结果,然而层序遍历要求的输出结果和bfs是不同的。层序遍历要求输出的是一个二维数组,而bfs的遍历结果是一维数组,无法区分每一层。
那么我们如何给bfs的遍历结果分层,这里用到一个辅助空间,队列。
我们先把根节点放到队列中,然后不断遍历队列。
根节点是树的第一层。第一层遍历完成,然后我们拿出根节点,如果左子树或右子树不为空,就把他们放在队列中,现在队列中有两个节点2,3。
树的第二层,接下来,会把2,3节点从队列中取出,在把2,3放入队列中,现在队列中有三个节点1,2,3。刚才给出的是一个临时的队列。
然后树的第三层,4,5,6,7放入临时队列中遍历
我们在把这四个节点从队列中拿出,放在最后的结果队列中。
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List <List<Integer>> list = new ArrayList<>();//返回类型是集合
Queue <TreeNode> queue = new LinkedList<>();//队列
if(root == null) return list;
queue.add(root);
while(queue.size() > 0){
int size = queue.size();
ArrayList <Integer> tmp = new ArrayList<>();
for(int i = 0;i < size;i++){
TreeNode t = queue.remove();
/*Queue 中 remove() 和 poll()都是用来从队列头部删除一个元素。
在队列元素为空的情况下,remove() 方法会抛出NoSuchElementException异常,poll() 方法只会返回 null 。
*/
tmp.add(t.val);
if(t.left != null){
queue.add(t.left);
}
if(t.right != null){
queue.add(t.right);
}
}
list.add(tmp);
}
return list;
}
}
参考题解
https://leetcode-cn.com/problems/binary-tree-level-order-traversal/solution/bfs-de-shi-yong-chang-jing-zong-jie-ceng-xu-bian-l/
https://leetcode-cn.com/problems/binary-tree-level-order-traversal/solution/die-dai-di-gui-duo-tu-yan-shi-102er-cha-shu-de-cen/