一、题目描述
给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。
示例:
二叉树:[3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回其层序遍历结果:
[
[3],
[9,20],
[15,7]
]
二、思路讲解
看到二叉树按层来遍历,我们首先想到的就是广度优先搜索bfs。但是此题与单纯的bfs不一样的点在于:题目中要按层分数组来返回,单纯的bfs是混在一起返回的,虽然顺序是按层的顺序,但是不同层之间并没有分隔。
所以,我们需要改变的部分就是把bfs遍历出来的节点按层分好。
我们可以在遍历每一层的时候获取一下当前队列的大小(队列中的节点都是一层的),将队列中的节点一次性弹出(同时也要压入下一层的节点);然后再获取队列中的大小,再一次性弹出,这样就可以保证按层来输出了。
三、Java代码实现
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNode left, TreeNode right) { * this.val = val; * this.left = left; * this.right = right; * } * } */ class Solution { public List<List<Integer>> levelOrder(TreeNode root) { //题目中要求返回的列表 List<List<Integer>> list = new ArrayList<>(); //bfs所用的队列 Queue<TreeNode> queue = new LinkedList<>(); if(root != null){ queue.add(root); } while(!queue.isEmpty()){ List<Integer> level = new ArrayList<>(); int n = queue.size(); //一次性把一层的节点遍历完,n只起到次数控制的作用 for(int i=0; i<n; i++){ TreeNode node = queue.poll(); level.add(node.val); if(node.left != null){ queue.add(node.left); } if(node.right != null){ queue.add(node.right); } } list.add(level); } return list; } }
四、时空复杂度分析
时间复杂度:每个点进队出队各一次,故渐进时间复杂度为 O(n)。
空间复杂度:队列中元素的个数不超过 n 个,故渐进空间复杂度为 O(n)。