package com.heu.wsq.leetcode.tree;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
/**
* 102. 二叉树的层序遍历
* @author wsq
* @date 2021/3/25
* 给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。
*
* 示例:
* 二叉树:[3,9,20,null,null,15,7],
*
* 3
* / \
* 9 20
* / \
* 15 7
* 返回其层序遍历结果:
*
* [
* [3],
* [9,20],
* [15,7]
* ]
*
* 链接:https://leetcode-cn.com/problems/binary-tree-level-order-traversal
*/
public class LevelOrder2 {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> ans = new ArrayList();
// 如果节点为空,直接返回
if(root == null){
return ans;
}
/**
* 由于是层次遍历,所以使用队列保存节点顺序
* 将root加入到队列中,并添加null为该层的结束标志
*/
Queue<TreeNode> queue = new LinkedList();
queue.offer(root);
queue.offer(null);
while(!queue.isEmpty()){
List<Integer> list = new ArrayList();
// 遍历queue,直到遇见null,表示该层结束。
TreeNode poll = queue.poll();
while(poll != null){
list.add(poll.val);
if(poll.left != null){
queue.offer(poll.left);
}
if(poll.right != null){
queue.offer(poll.right);
}
poll = queue.poll();
}
// 如果当前queue不是空,怎么还存在元素需要输出,则需要加结束标识
if(!queue.isEmpty()){
queue.offer(null);
}
ans.add(list);
}
return ans;
}
}