文章目录
题目
方法一:队列(bfs)
借助队列,记录每一层节点 ,一层一层的往集合里面加的同时,也往队列里面更新下一层的数据
// 方法一 : 借助队列 每次弹出一个节点就加入该节点的左右孩子到队列中,并且根据当前队列的大小来取出每层的节点
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> result = new ArrayList<>();
if(root == null) return result;
Queue<TreeNode> queue = new LinkedList<TreeNode>();
queue.offer(root);//先加入根节点
while(!queue.isEmpty()){//循环终止条件为队列为空
int count = queue.size(); //提前记录这一层多少个节点
List<Integer> res = new ArrayList<>();//用于存每一层的节点的集合
for(int i = 0 ;i < count; i++){//取出每一层的所有节点 加入到res中 不能用queue.size()作为循环条件终止 因为循环体里面会往队列里面加元素 queue.size()是会变化的
TreeNode node = queue.poll();
res.add(node.val);
if(node.left != null) queue.offer(node.left); //如果该层的下一个左节点不为null 就加入队列
if(node.right != null) queue.offer(node.right); //如果该层的下一个右节点不为null 就加入队列
}
result.add(res);//将每层的节点的list集合加入到大集合
}
return result;
}